c++ 霍夫變換檢測直線


通常這是一幅邊緣圖像,比如來自 Canny算子。cv:: Houghlines函數的輸出是
cV::Vec2f向量,每個元素都是一對代表檢測到的直線的浮點數(p,0)。在下例中
我們首先應用 Canny算子獲取圖像輪廓,然后基於霍夫變換檢測直線

這個函數的的表達直線的方式用的不習慣的話可以用下面這個。

HoughLinesP函數的原型為:

void HoughLinesP(InputArray image,OutputArray lines, double rho, double theta, int threshold, double minLineLength=0,double maxLineGap=0 )

image為輸入圖像,要求是8位單通道圖像

lines為輸出的直線向量,每條線用4個元素表示,即直線的兩個端點的4個坐標值

rho和theta分別為距離和角度的分辨率

threshold為閾值,即步驟3中的閾值

minLineLength為最小直線長度,在步驟5中要用到,即如果小於該值,則不被認為是一條直線

maxLineGap為最大直線間隙,在步驟4中要用到,即如果有兩條線段是在一條直線上,但它們之間因為有間隙,所以被認為是兩個線段,如果這個間隙大於該值,則被認為是兩條線段,否則是一條。

 

http://blog.csdn.net/viewcode/article/details/8090932

 http://blog.csdn.net/zhaocj/article/details/40047397

int main()
{
    Mat img = imread("D:\\pdf2jpg\\nn\\00010.jpg");

    //GetRedComponet(img);
    Mat contours,res;
    Canny(img,contours,125,350);
    cvtColor( contours, res, CV_GRAY2BGR );  
    vector<Vec4i> lines;  
    HoughLinesP(contours, lines, 1, CV_PI/180, 80, 30, 10 );  
    for( size_t i = 0; i < lines.size(); i++ )  
    {  
        Vec4i l = lines[i];  
        line(res, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0,0,255), 2);  
    }  
    imwrite("D:\\dst1.jpg",res);
}

 統計概論霍夫直線檢測houghlinesP是一個改進,不僅執行效率較高,而且能檢測到直線的兩個端點。
思想:
先隨機檢測出一部分直線,然后將直線上點的排查掉,再進行其他直線的檢測

1. 首先僅統計圖像中非零點的個數,對於已經確認是某條直線上的點就不再變換了。
2. 對所以有非零點逐個變換到霍夫空間
    a. 並累加到霍夫統計表(圖像)中,並統計最大值
    b. 最大值與閾值比較,小於閾值,則繼續下一個點的變換
    c. 若大於閾值,則有一個新的直線段要產生了
    d. 計算直線上線段的端點、長度,如果符合條件,則保存此線段,並mark這個線段上的點不參與其他線段檢測的變換


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM