利用OpenCV識別圖像上的線條軌跡

公司有個項目裏要用到利用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生成線條的,形狀倒是差不多,就是姿態反了~


-----------------------------------------------------------

網址:教你高效且優雅的訪問國外的網站(點擊此處)


-----------------------------------------------------------


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章