qtでopencvを使用してボックスソートアプリケーションを開発しようとしています。箱の幅と長さを測りたいです。
上の画像に示すように、ボックス内に印刷されているものに関係なく、ボックスの幅と長さを提供する最も外側の線 (つまり、ボックスのエッジ) のみを検出したいと考えています。
私が試したこと:
最初
Findcontours()
に最大面積の輪郭を使用して選択しようとしましたが、外側のエッジの輪郭が何度も囲まれていないため(キャニー出力のどこかで壊れている)、輪郭として検出されません。ハフライン変換では、あまりにも多くの行が得られます.4行だけを取得する方法がわかりません.
私は自分のアルゴリズムを次のように試しました。
イメージをグレースケールに変換します。
画像の1列を取り、すべてのピクセルをその列の次の連続するピクセルと比較します。その値の差が、ピクセルがエッジに属するしきい値(たとえば100)より大きい場合は、配列に格納します。すべての列に対してこれを行うと、x 軸に平行なボックスの上の線が得られます。
同じ手順に従いますが、最後の列と最後の行から (つまり、下から上へ)、x 軸に平行な下の線が表示されます。
同様に、y 軸に平行な線も見つけます。これで、各辺に 1 つずつ、合計 4 つの点の配列ができました。
これで、ボックスの側面が X 軸と Y 軸に正確に平行になるようにボックスを配置すると、良い結果が得られます。ボックスを少しでもある方向に向けて配置すると、下の画像に示すように明らかな対角線が表示されます。
下の画像に示すように、4 つの点の配列すべてから最初の 10 点と最後の 10 点を削除し (対角線を描画する役割を果たします)、線を描きました。これは、ボックスがさらに傾いていると機能せず、測定値もうまくいきません。 .
今、私の質問は、
ボックスに印刷されたものを無視して、ボックスの外縁(長方形)のみを取得し、そこに寸法を取得する簡単な方法はありますか?
必ずしもアルゴリズムの修正/改善を求めているわけではありませんが、それに関する提案も大歓迎です。このような大きな投稿で申し訳ありません。