2

オブジェクトがあり、その正確な中心を定義したいと考えています。OpenCV を使用してエッジを検出しCanny、次にHoughLinesP行を検出します: this を参照してください

オブジェクトが完全な長方形ではなく、ここで検出されるバンプがある場合があるため、ハフ変換を使用します。

行は構造体で定義されます。中点、角度、長さも計算します。

struct hLine {
    Point pStart, pEnd, pMidpoint;
    float angle;
    int length;
};

ご覧のとおり、側面に沿って複数の線が検出されています。

問題は、長方形の各辺 (この場合は 0、1、3、4) の最長の線を取得する方法です。

私が試したアプローチは、線の方程式y = kx + nを計算し、線を角度、長さ、nで並べ替え、 nがいくつかの数 (長方形の反対側) で区切られている線のみを保持することでした。垂直線に問題があり(nを計算できません)、オブジェクトがほぼ垂直な場合でもn数が大きいため、線は削除されません。

次のステップは、線の交点を計算してから中心を計算することです。アイデアはこのチュートリアルに基づいています: opencv-code.com/tutorials/automatic-perspective-correction-for-quadrilateral-objects/

また、誰かが正確な中心点を検出するためのより良い解決策を持っている場合は、声を上げてください:)

4

3 に答える 3

1

canny を使用してエッジを検出した後、モルフォロジー クロージング操作を使用してエッジを結合できます。次に、輪郭を見つけ、多角形近似を使用して輪郭を滑らかにします。見つかったすべての四角形について、角がほぼ 90 度であるかどうかをチェックして、それが長方形であることを確認できます。サンプル画像によると、検出した最大の長方形は、関心のある長方形である必要があります (各輪郭の凸包を見つけて、凸包に多角形近似を適用することもできます)。

于 2013-08-23T16:48:06.850 に答える
0

私はするだろう:

  • まず、データの OBB (向きのある境界ボックス) を計算します。
  • OBB のエッジに沿って、事前に定義された精度の幅で 4 つのバウンディング ボックスを作成します。
  • 4 つのエッジ境界ボックスの 1 つ以上にあるすべてのポイントを破棄します。
  • エッジ用に 4 つの最小エッジ バウンディング ボックスを作成します (ここではバンプを破棄します)。
  • 4 つのエッジ境界ボックスの中心線から長方形を作成します。
  • 長方形の中心を計算します。
于 2013-08-23T13:42:59.857 に答える
0

私は次のようにします:

  1. ハフ変換を使用して直線方程式を計算します。法線ベクトルで線をパラメータ化する場合、垂直/水平線に問題はないはずです。
  2. 次に、線の交点を計算して長方形の 4 つの角を取得します。
  3. 最後に、長方形の対角線の方程式を計算し、それらの交点を探して中心を取得します。

ステップ1と2は、あなたが提供したリンクですでに完了しています。

ハフライン検出が十分に堅牢でない場合はどうなりますか?

この場合、A. Desolneux によって提案された意味のあるアライメントと呼ばれる 1 つの非常に堅牢な検出アルゴリズムを使用します。その背後にある計算は、最初は少し恐ろしく見えるかもしれませんが、アルゴリズムは依然として非常に簡単に実装できます (ただし、少し遅いかもしれません)。私は過去にそれを使用しましたが、結果は著者が主張するのと同じくらい良いです.

于 2013-08-23T14:07:34.877 に答える