5

線を含む特定の画像が OpenCV の HoughLine 変換に渡されると、rho と theta のペアのリストが返されます。各ペアは個々の線を定義します。この rho,theta ペアのリストにリストされている行の順序は何ですか?

たとえば、この8行の 画像をpythonで使用した場合、8行の画像

次のように、8 行分の rho,theta 行列が返されました。

[[ 461.            1.48352981]
 [ 380.            1.48352981]
 [ 212.            1.48352981]
 [ 112.            1.48352981]
 [  65.            1.48352981]
 [ 334.            1.48352981]
 [ 269.            1.48352981]
 [ 508.            1.48352981]]

このマトリックスにリストされている行の順序は、openCV によってどのように決定されますか?

4

2 に答える 2

4

OpenCV ソース コードからhttps://github.com/opencv/opencv/blob/master/modules/imgproc/src/hough.cpp

関数 HoughLinesStandard は、80 行目から始まる標準のハフ変換を実装します。

さらに下にスクロールすると (166 行目)、次のことがわかります。

 // stage 3. sort the detected lines by accumulator value
    std::sort(_sort_buf.begin(), _sort_buf.end(), hough_cmp_gt(accum));

これで、行のリストがアキュムレータ値で昇順にソートされます。そして、最良のlinesMax結果が出力バッファーに入れられます。

 // stage 4. store the first min(total,linesMax) lines to the output buffer
    linesMax = std::min(linesMax, (int)_sort_buf.size());
    double scale = 1./(numrho+2);
    for( i = 0; i < linesMax; i++ )
    {
        LinePolar line;
        int idx = _sort_buf[i];
        int n = cvFloor(idx*scale) - 1;
        int r = idx - (n+1)*(numrho+2) - 1;
        line.rho = (r - (numrho - 1)*0.5f) * rho;
        line.angle = static_cast<float>(min_theta) + n * theta;
        lines.push_back(Vec2f(line.rho, line.angle));

アキュムレータの値がわからない場合は、ハフ変換の仕組みを読んでください。https://en.wikipedia.org/wiki/Hough_transform

基本的には、ロー シータ ペアに寄与したピクセル数を示します。

于 2017-12-15T12:42:58.380 に答える
1

それらは辞書式の (r, Θ) または (Θ, r) の順序で返される可能性があるため、平行線は原点からの距離を増やすかランダムに発生します (角度の順序は予測できません)。

関数の設計者が特定の順序を強制する理由はありません。一般的なケースでは行の論理がないためです (平行線または準平行線は例外です)。

特定の順序が必要な場合は、それを指定して実装するのはあなた次第です。たとえば、 r を増やしてソートし、 Θ が半回転したときに負の符号を割り当てるように注意します。交点の縦座標で並べ替えることもできます。


ピグレットの発見後、彼らは力によって返還されます. 私の前の段落はまだ適用されます。

于 2017-12-15T08:41:02.773 に答える