2017-06-21 78 views
0

我首先使用Canny檢測器從二值圖像中提取邊緣。結果是完美的,但後來我用hough變換來矢量化這些邊緣。然而,我得到的線是錯誤的,大量不存在的水平線只是無處不在。OpenCV Hough Line Transform提供了不存在的水平線

edges

霍夫線 lines

100票 enter image description here

代碼和參數我用

// detect edges. 
    cv::Mat1b edges(bw.size()); 
    cv::Canny(bw, edges, 40, 120); 

    // detect lines. 
    std::vector<cv::Vec4i> lines; 
    cv::HoughLinesP(edges, lines, 1, CV_PI/180, 0); 

    // minimum 100 votes version. 
    cv::HoughLinesP(edges, lines, 1, CV_PI/180, 100); 

    cv::Mat1b tmp(edges.size()); 
    for (unsigned i = 0; i < lines.size(); i ++) { 
      cv::Vec4i const& line = lines[i]; 
      cv::line(tmp, cv::Point(line[0], line[1]), cv::Point(line[2], line[3]), cv::Scalar(255)); 
    } 
+1

爲什麼你的門檻0?你可以考慮Hough變換的一種方式是它用線條填充圖像,然後對圖像中的每個白色像素放置該行,將該行+1賦予其分數。有了「閾值」,你就會問「一條線有多少點可以讓我把它算作一條線?」所以如果你的門檻值爲0,那就意味着......來自霍夫的每條可能的線都在你的影像中。而是嘗試50或100或類似的東西。這實際上並不是Hough變換的工作原理,但它非常接近。 –

+0

我明白了。它應該調用投票數。在將閾值設置爲100,300和500之後,水平線是固定的,但好的線條消失了。我將編輯帖子以包含這些圖片。 – Davis

+0

哦。不,你有一個不同的奇怪問題。最近有一個非常類似的問題,在'lines'中有數百萬行*。此外,每個「行」中的值都是完全奇怪的,大量的數字。你也一樣嗎?它看起來是一個非常奇怪的錯誤。見[這裏](https://stackoverflow.com/questions/44661140/opencv-3-2-0-houghlinesp-returns-out-of-bounds-lines-c)。此外[這](https://stackoverflow.com/questions/43645923/opencv-houghline-function-create-unlimited-lines)有一個發佈的答案,不知道它是否會有所幫助。 –

回答

1

有些掙扎後,我發現:這不是什麼問題隨着hough變換。問題是我用cv :: Mat1b tmp(edges.size());作爲輸出目標。看來cv :: line不能繪製二進制圖像。它可能會溢出造成這些錯誤像素的圖像邊界。當我將它切換到cv :: Mat1i tmp(edges.size());事情很好。

固定的代碼

// detect edges. 
    cv::Mat1b edges(bw.size()); 
    cv::Canny(bw, edges, 40, 120); 

    // detect lines. 
    std::vector<cv::Vec4i> lines; 
    cv::HoughLinesP(edges, lines, 1, CV_PI/180, 40, 100, 200); 

    cv::Mat1i tmp(edges.size()); 
    for (unsigned i = 0; i < lines.size(); i ++) { 
      cv::Vec4i const& line = lines[i]; 
      cv::line(tmp, cv::Point(line[0], line[1]), cv::Point(line[2], line[3]), cv::Scalar(255)); 
    } 

    cv::imwrite("tmp.png", tmp); 

結果: enter image description here