2017-06-21 6 views
0

私は最初にcanny detectorを使用して2値画像からエッジを抽出します。結果は完璧ですが、ハフ変換を使用してこれらのエッジをベクトル化しました。しかし、私が得たラインは、存在しない水平線の大部分がどこからも飛び出さないという誤ったものです。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?ハフ変換について考えられる方法の1つは、画像を線で塗りつぶしてから、その線上に置かれた画像内のすべての白い画素に対して、その線にその点数+1を与えることです。 「スレッショルド」では、「ラインとして数えるには、どれくらいのポイントでタッチする必要がありますか」と尋ねています。だからあなたのしきい値が0であれば、ハフからのすべての可能なラインがあなたのイメージにあります。代わりに、50や100などを試してみてください。これは実際にハフ変換がどのように動作するかではなく、かなり近いです。 –

+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

を使用し、私はそれがwasnことが判明しましたプロブレムハフ変換を使用しています。問題は私が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

関連する問題