0

qtでopencvを使用してボックスソートアプリケーションを開発しようとしています。箱の幅と長さを測りたいです。

入力画像

上の画像に示すように、ボックス内に印刷されているものに関係なく、ボックスの幅と長さを提供する最も外側の線 (つまり、ボックスのエッジ) のみを検出したいと考えています。

私が試したこと:

  1. 最初Findcontours()に最大面積の輪郭を使用して選択しようとしましたが、外側のエッジの輪郭が何度も囲まれていないため(キャニー出力のどこかで壊れている)、輪郭として検出されません。

  2. ハフライン変換では、あまりにも多くの行が得られます.4行だけを取得する方法がわかりません.

  3. 私は自分のアルゴリズムを次のように試しました。

    イメージをグレースケールに変換します。

    画像の1列を取り、すべてのピクセルをその列の次の連続するピクセルと比較します。その値の差が、ピクセルがエッジに属するしきい値(たとえば100)より大きい場合は、配列に格納します。すべての列に対してこれを行うと、x 軸に平行なボックスの上の線が得られます。

    同じ手順に従いますが、最後の列と最後の行から (つまり、下から上へ)、x 軸に平行な下の線が表示されます。

    同様に、y 軸に平行な線も見つけます。これで、各辺に 1 つずつ、合計 4 つの点の配列ができました。

これで、ボックスの側面が X 軸と Y 軸に正確に平行になるようにボックスを配置すると、良い結果が得られます。ボックスを少しでもある方向に向けて配置すると、下の画像に示すように明らかな対角線が表示されます。

間違った出力

下の画像に示すように、4 つの点の配列すべてから最初の 10 点と最後の 10 点を削除し (対角線を描画する役割を果たします)、線を描きました。これは、ボックスがさらに傾いていると機能せず、測定値もうまくいきません。 .

ここに画像の説明を入力

今、私の質問は、

ボックスに印刷されたものを無視して、ボックスの外縁(長方形)のみを取得し、そこに寸法を取得する簡単な方法はありますか?

必ずしもアルゴリズムの修正/改善を求めているわけではありませんが、それに関する提案も大歓迎です。このような大きな投稿で申し訳ありません。

4

2 に答える 2

0

ボックスは対照的な背景に配置されているため、大津のしきい値を使用できるはずです。

  • 画像のしきい値を設定します(大津法を使用)
  • ボックス領域の外側にある浮遊ピクセルを除外します (そのようなピクセルが多くなく、中央値または形態学的フィルターで簡単に削除できることを願っています)
  • 輪郭を見つける
  • すべての輪郭点を結合し、それらの凸包を取得します (ここでのアイデアは、接続性に関係なく、ボックス領域内のこれらすべての輪郭の境界となる凸領域を見つけることです)
  • この凸包に多角形近似 (approxPolyDP) を適用し、四角形が得られるかどうかを確認します
  • 遠近法の歪みがない場合は、長方形を取得する必要があります。それ以外の場合は、それを修正する必要があります
  • 長方形を取得すると、その寸法があります。凸包の最小面積の長方形 (minAreaRect) を見つけることもできます。これにより、RotatedRect が直接得られます。
于 2014-08-04T07:42:29.820 に答える