公司有個項目裏要用到利用OpenCV來識別線條輪廓,在CSDN裏看到了一篇類似的,自己加工驗證了一下,這個算法只對簡單的線條好使,對複雜一點的就沒那麼靈了。不過還是在此記錄一下吧~
軟件環境:Win7-64, VS2010, OpenCV2.4.11
思路:根據圖形中的每個像素點的差異去判斷,對原圖的灰度圖做二值化處理,不是線條的區域像素置0,有線條的區域置爲255,然後逐列進行像素求和,如果列的和大於0則是檢測到了線條,此時結束該列的掃描,繼續掃描下一列。這樣就可以得到線條的軌跡了。
#include <iostream>
#include <opencv2/opencv.hpp>
#include <fstream>
using namespace std;
using namespace cv;
int main()
{
Mat src = imread("3.png", 0); //導入圖片
//imshow("src", src);
Mat dst;
threshold(src, dst, 100, 255, CV_THRESH_BINARY_INV); //二值化
//imshow("dst", dst);
int nRows = dst.rows;
int nCols = dst.cols;
ofstream fout("data.txt");
//按列掃描,求像素和,由於是二值後的圖片,沒有線條時,該列的像素和爲0;掃描到線條時像素大於0
for(int w = 0; w < nCols; w++)
{
int sum = 0;
for(int h = 0; h < nRows; h++)
{
uchar *pRow = dst.ptr<uchar>(h, w); //該列中每個像素的地址
sum += (int)(*pRow);
if(sum > 0) //到達了線條的上側,像素和大於0
{
cout << ""; //從上往下找,由於線條很細,目前只判斷上邊界。
cout << "X = " << w << ", Y = " << h << endl;
fout << "X = " << w << ", Y = " << h << endl; //控制檯會丟失數據,存到文本不會丟失
sum = 0;
break;
}
}
}
waitKey();
cout << endl;
system("pause");
return 0;
}
程序運行結果:
數據處理:我是把數據生成TXT文本,然後到入到excel生成線條的,形狀倒是差不多,就是姿態反了~
-----------------------------------------------------------
-----------------------------------------------------------