10

私は形状認識アプリに取り組んでいます。この時点で、一連のポイント(x、y)がコーナー検出器(赤いポイント、img。2)によって決定されます。これらの点のうちの4つ(赤い枠内、img。2。は、長方形(場合によっては少し変形した長方形)の頂点です。とりわけそれらを見つけるための最良の方法は何でしょうか?

入力画像の例を次に示します。 入力画像

そして、コーナー検出後は次のようになります。

角が検出された画像

4

4 に答える 4

11

これはあなたの質問に対する答えではありません-それは単なる提案です。

私の意見では、コーナー検出器は長方形を検出するための悪い方法です-mathematician1975が示唆したように、すべてのポイント距離を計算するには多くの時間がかかります。この状況では、別の手法を使用する必要があります。

  1. そのスタンプは紫色なので、最初にすべきことは色のセグメンテーションです。
  2. 手順1を完了したら、 Houhg変換を使用してバイナリイメージの線を検出できます。または、画像内のすべての輪郭を見つけます。
  3. そして最後のステップは長方形を検出することです。

アップデート:

これは、灰色の画像でも機能するはずの別の解決策です。

  1. 画像を1ビットに変換するためのしきい値を実行します(しきい値として255から200を使用しました)。
  2. ある定数よりも大きな領域を持つ新しい画像のすべての輪郭を見つけます(私は1000を取りました)。
  3. 各輪郭の外接する長方形を見つけて、チェックを行います。

ContourArea/BoundingReactangleArea>定数

私はこれconstant0.9と見なします。

そして、このアルゴリズムは私に次の結果をもたらしました: ここに画像の説明を入力してください

OpenCVコードは次のとおりです。

Mat src = imread("input.jpg"), gray, result;
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;

result = Mat(src.size(), CV_8UC1);

cvtColor(src, src, CV_BGR2GRAY);
threshold(src, gray, 200, 255, THRESH_BINARY_INV);
findContours(gray, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));

result = Scalar::all(0);
for (size_t i=0; i<contours.size(); i++)
{
    Rect rect = boundingRect(contours[i]);
    if (rect.area() > 1000)
    {
        double area = contourArea(contours[i]);
        if (area/rect.area() > 0.9)
        {
            drawContours(result, contours, i, Scalar(255), -1);
        }
    }
}
于 2012-08-28T11:45:22.343 に答える
9

4つの異なる点の各ペアの間にある6つの長さのセットを計算します。3つ以上の異なる値がある場合、6つの長さのセット内に、長方形はありません(2つの等しい辺の長さと等しい対角線の長さ)

于 2012-08-28T11:39:27.893 に答える
2

点群を視覚的に調べることで、すでに多数の長方形を区別できることをご存知ですか?言い換えれば、ある種の事前選択ルーチンを実行しないと、多くの長方形が見つかる可能性があります...

とにかく、@ mathematician1975によってすでに与えられている方法とは別に、辺が(多かれ少なかれ)平行であるかどうかを確認することもできます。

method 1@mathematician1975のメソッドと並列チェックを呼び出しましょうmethod 2。それで:

%# method 1: 
n1 = |u1-u2|    %#  3 sub., 3 mult, 2 add. per distance
n2 = |u3-u2|    %#  total of 6 distances to compute.
n3 = |u4-u3|    %#  then max 5+4+3+2+1 = 15 comp. to find unique distances
n4 = |u1-u4|    
n5 = |u4-u2|    %#  Total:
n6 = |u3-u1|    %#  12 sub., 18 mult., 12 add, 15 comp



%# method 2:
w1 = u1-u2       %#  3 subtractions per vector
w2 = u3-u2       %#  total of 4 vectors to compute 
w3 = u3-u2
w4 = u1-u4                
                        %#  12 sub.
abs(w1-w3) == [0 0 0]   %#  3 sub., 3 comp., 1 sign.
abs(w2-w4) == [0 0 0]   %#  3 sub., 3 comp., 1 sign.

                        %# Total: 18 sub., 6 comp. 2 sign.

これらは両方とも最悪の場合であることに注意してください。少しの簿記で、両方のコストを大幅に削減できます。

method 2また、頂点がすでに正しい順序になっていることを事前に知っておく必要があることにも注意してください。そうでない場合は、コストが4倍になり、それ以上になりmethod 1.ます。

距離をどのように計算しているか聞いてもいいですか?

于 2012-08-28T12:11:52.320 に答える
0

8あなたは数を持っているべきだったが、あなたは数を持っていると考えてください、そしてあなたはそれを修正するために数(デルタまたはエラー訂正と呼ばれる)7を追加しようとしています。1

同様の方法で、長方形を修正するためのデルタ長方形座標を使用します。ポイント(座標)がデルタ長方形の内側にあることを確認します。

長方形の座標は次のとおりです。

x+delta,y+delta
x-delta,y+delta
x+delta,y-delta
x-delta,y-delta

これがうまくいくかどうか、またはより良い解決策を見つけたかどうかを教えてください

于 2012-08-28T11:53:23.380 に答える