OpenCV 提取圖片中的曲線
簡單介紹
在實際的應用中,我們常常需要對影象中的曲線進行描述、處理,這個曲線可以是輪廓,骨架或者其他。可以用deque<Point>
描述曲線,接下來簡單介紹下如何從圖片中搜索這些曲線並儲存。
首先,輸入的圖片是一張二值圖片 (白色為曲線),其中包含的曲線寬度為 1 畫素的 (如果曲線不是 1 畫素的 先提取其骨架)。遍歷尋找影象中第一個白色的點,然後從這個點開始延伸尋找曲線。注意,第一個找到的點不一定是曲線的端點,因此應該分別向兩邊尋找相鄰的點,因此deque
會好一些。每找到一個點,將其儲存deque
而後置黑(防止重複尋找)。搜尋到一個沒有相鄰點的點,表示一端搜尋完成。
值得注意的一點是,我在寫搜尋相鄰點的時候,會首先搜尋此點與上一個點相鄰位置相對的位置,如果沒有,則分別搜尋向兩邊搜尋。這樣的好處是可以減少尋找的次數,而且當有相交的曲線時,能連線到我們一般認為的曲線。
程式碼
//尋找影象曲線上某個點的下一個點
bool findNextPoint(vector<Point> &_neighbor_points, Mat &_image, Point _inpoint, int flag, Point& _outpoint, int &_outflag)
{
int i = flag;
int count = 1;
bool success = false;
while (count <= 7)
{
Point tmppoint = _inpoint + _neighbor_points[i];
if (tmppoint.x > 0 && tmppoint.y > 0 && tmppoint.x < _image.cols&&tmppoint.y < _image.rows)
{
if (_image.at<uchar>(tmppoint) == 255)
{
_outpoint = tmppoint;
_outflag = i;
success = true ;
_image.at<uchar>(tmppoint) = 0;
break;
}
}
if (count % 2)
{
i += count;
if (i > 7)
{
i -= 8;
}
}
else
{
i += -count;
if (i < 0)
{
i += 8;
}
}
count++;
}
return success;
}
//尋找影象上的第一個點
bool findFirstPoint(Mat &_inputimg, Point &_outputpoint)
{
bool success = false;
for (int i = 0; i < _inputimg.rows; i++)
{
uchar* data = _inputimg.ptr<uchar>(i);
for (int j = 0; j < _inputimg.cols; j++)
{
if (data[j] == 255)
{
success = true;
_outputpoint.x = j;
_outputpoint.y = i;
data[j] = 0;
break;
}
}
if (success)
break;
}
return success;
}
//尋找曲線
void findLines(Mat &_inputimg, vector<deque<Point>> &_outputlines)
{
vector<Point> neighbor_points = { Point(-1,-1),Point(0,-1),Point(1,-1),Point(1,0),Point(1,1),Point(0,1),Point(-1,1),Point(-1,0) };
Point first_point;
while (findFirstPoint(_inputimg, first_point))
{
deque<Point> line;
line.push_back(first_point);
//由於第一個點不一定是線段的起始位置,雙向找
Point this_point = first_point;
int this_flag = 0;
Point next_point;
int next_flag;
while (findNextPoint(neighbor_points, _inputimg, this_point, this_flag, next_point, next_flag))
{
line.push_back(next_point);
this_point = next_point;
this_flag = next_flag;
}
//找另一邊
this_point = first_point;
this_flag = 0;
//cout << "flag:" << this_flag << endl;
while (findNextPoint(neighbor_points, _inputimg, this_point, this_flag, next_point, next_flag))
{
line.push_front(next_point);
this_point = next_point;
this_flag = next_flag;
}
if (line.size() > 10)
{
_outputlines.push_back(line);
}
}
}
//隨機取色 用於畫線的時候
Scalar random_color(RNG& _rng)
{
int icolor = (unsigned)_rng;
return Scalar(icolor & 0xFF, (icolor >> 8) & 0xFF, (icolor >> 16) & 0xFF);
}
int main()
{
Mat image = imread("images\\2.bmp");
Mat gray;
cvtColor(image, gray, CV_BGR2GRAY);
vector<deque<Point>> lines;
findLines(gray, lines);
cout << lines.size() << endl;
//draw lines
Mat draw_img = image.clone();
RNG rng(123);
Scalar color;
for (int i = 0; i < lines.size(); i++)
{
color = random_color(rng);
for (int j = 0; j < lines[i].size(); j++)
{
draw_img.at<Vec3b>(lines[i][j]) = Vec3b(color[0], color[1], color[2]);
}
}
imshow("draw_img", draw_img);
imwrite("images\\draw_img.bmp", draw_img);
waitKey(0);
system("pause");
return 0;
}
結果
輸入影象
結果
相關推薦
OpenCV 提取圖片中的曲線
簡單介紹 在實際的應用中,我們常常需要對影象中的曲線進行描述、處理,這個曲線可以是輪廓,骨架或者其他。可以用deque<Point> 描述曲線,接下來簡單介紹下如何從圖片中搜索這些曲線並儲存。 首先,輸入的圖片是一張二值圖片 (白色為曲線
能提取圖片中的文字的小程序
步驟 def pro 並且 ext 進行 文字 迅捷 程序 如果你需要將圖片上的文字提取出來會用什麽方法呢?我用的是微信小程序,它叫迅捷文字識別,是一個專業的文字識別工具,課可以將圖片中的文字提取出來,並且可以對結果進行翻譯和復制。 操作步驟: 1:先打開微信運行微信 2:
使用騰訊OCR識別提取圖片中的文字
使用騰訊的OCR,官方文件上給出兩種方式,一種是自己寫請求,一種是使用騰訊整合的SDk,本次使用的是SDK,下載地址為:https://cloud.tencent.com/document/product/866/17600,根據需要選擇對應的SDK下載,本次以OCR-通用印
Python 利用百度文字識別 API 識別並提取圖片中文字
Python 利用百度文字識別 API 識別並提取圖片中文字 利用百度 AI 開發平臺的 OCR 文字識別 API 識別並提取圖片中的文字。首先需註冊獲取 API 呼叫的 ID 和 key,步驟如下: 開啟百度AI開放平臺,進入控制檯中的文字識別應用(需要有百度賬號)。
opencv提取影象中的顏色直方圖(RGB、HSV)
本篇部落格主要介紹利用opencv工具提取一幅影象中的顏色直方圖特徵。所謂顏色直方圖,指的是一幅影象中的顏色分佈,與影象中的特定的物體無關,只是用來表示人的眼睛觀察到的影象中的顏色分佈情況,例如說,一幅圖中紅色佔了多少比例,綠色佔了多少比例等。 我們知道,計算機色彩顯示器採
C# 圖片識別技術(支援21種語言,提取圖片中的文字)
C# 圖片識別技術(支援21種語言,提取圖片中的文字) 圖片識別的技術到幾天已經很成熟了,只是相關的資料很少,為了方便在此彙總一下(C#實現),方便需要的朋友查閱,也給自己做個記號。 圖片識別的用途:很多人用它去破解網站的驗證碼,用於達到自動刷票或者是批量註冊的目的,但我覺得它最吸引我的
使用opencv從圖片中裁剪出任意形狀的四邊形
寫在前面:之前是先得到任意四邊形的最小外接矩形,再使用opencv進行裁剪,但是這樣會引入噪聲。所以在此記錄下,如何直接裁剪原任意四邊形區域。 思路: 1.計算要裁剪區域四邊形的相對水平方向的旋轉角度; 2.將原圖旋轉該角度,以使得要裁剪的區域旋轉到水平方向; 3.將
opencv提取圖片直方圖的的波谷的的x值
直方圖程式碼引用http://blog.csdn.net/qq_23880193/article/details/49669297 輪廓凸包檢測引用http://blog.csdn.net/lichengyu/article/details/38392473 函式Mat hist11
如何提取圖片中的文字轉換成word
有時候看到需要的文件資料,卻發現是內容是在圖片上面,那有沒有辦法可以將這圖片上的內容直接轉換成為word文件呢?想要將圖片上的文字提取出來其實很簡單,不用手動輸入就可以直接轉換成word。 處理圖片如果處理的圖片較少,可以直接線上對圖片上的文字進行識別,轉
oc 提取圖片中的顏色
一、下載地址 下載:https://github.com/puyangdev/PYColorPicker 二、 效果 三、關鍵程式碼 //獲取圖片某一點的顏色 - (UIColor *)color
opencv 在圖片中找對應矩形(形狀分析)
已有一張圖片,找到裡面需要的矩形。 程式碼 #include <opencv2/opencv.hpp> #include <opencv2/opencv_modules.hpp> #include <opencv2/nonf
opencv在圖片中寫入文字
由於一個小專案的需要,我得在把1000多個賬號貼上到特定的圖片上打印出來,簡直可怕。 系統 : windows7 環境 : vs2010+opencv-2.4.0 opencv+vs配置 freeType+opencv+vs:編譯、整合與配置
Python提取圖片中的文字資訊,騰訊內部技術,一行程式碼搞定!
用過手機QQ就知道,點選一個圖片會彈出一個小功能,那就是提取圖片中的文字。非常方便實用,那麼很難實現嗎?利用Python提取圖片中的文字資訊,只需要一行程式碼就能搞定!當然,這是吹牛皮的,但是真正的Python程式碼也就第4行,說是一行程式碼搞定也沒錯。示例:效果儘管執行Py
opencv訪問圖片中畫素的方法(二)——迭代器iterator
opencv訪問圖片畫素的第二種方法為:迭代法。在迭代法中,我們所需要的僅僅是獲得矩陣的begin和end,然後增加迭代直至 從begin到end。將*操作符新增在迭代指標前,即可訪問當前指向的內容。相比於指標直接訪問可能出現越界問題,迭代器絕對 是非常安全的方法。用關鍵字
opencv 讀取圖片並提取Mat中data資料
uchar* pImageData = (uchar*)malloc(width*height* 3 * sizeof(uchar));Mat MyImage = imread(file_name,IMREAD_COLOR); if(!MyImage
使用Spark批量上傳圖片到HBase中並同時使用OpenCV提取SIFT特徵值
最近正在學習利用Spark做影象的分類和檢索實驗,首先需要上傳影象資料(儲存在本地檔案系統中)到HBase中,提取的影象特徵是SIFT,藉助OpenCV庫提取,剛開始是寫一個任務上傳圖片,然後再寫一個任務提取HBase中影象的特徵值,考慮到圖片的序列化和反序列化
從視頻中提取圖片,對圖片做人臉檢測並截取人臉區域
rep pan details 一個 ons sprintf imread href multipl 環境配置:VS2013+opencv2.4.10+libface.lib 參考博客:http://blog.csdn.net/augusdi/article/details
從一段視頻中按幀提取圖片
imp book ima open HA image %d 數據 使用 這裏實現的是從一段視頻中每10幀讀取第10幀圖片,代碼如下: # -*- coding:utf-8 -*- #視頻中按序列提取幀,獲得訓練數據 import cv2 import os
從圖片中完整切除圓形物體 opencv+python
面臨一個任務就是要圖片中的圓形物體切出來,然後做異常點檢測(就是看那些圓形物體是異常點),因為異常點檢測的方法還在摸索,現在就先把從圖片中把圓形物體完整切出的方法寫出來。 1.首先圖片是這樣的(圓形物體非常多) 2.接下來就是程式碼部分: import os import c
對圖片中的區域性文字提取的教程
怎麼對圖片中的區域性文字進行提取呢?有時候我們在圖片上看到一段文字想儲存下來這個時候就需要使用文字提取的方法了,具體怎樣去操作呢?下面就來分享一個教程。 步驟一、如果想對圖片中的文字進行提取,則我們需要藉助相關OCR文字識別軟體來實現,你可以搜尋迅捷辦公找到迅捷OCR文字識別軟體將其下載安裝下來。