ラズベリーPI上の大きな画像(2500 x 2000)の比較的小さいQRコード(110×10 10ピクセル)を検出して復号する必要があります。 QRコードはフレーム内の任意の場所にあり得るが、向きは正常であると予想される、すなわちトップアップ。私たちは高品質の産業用カメラとレンズを使用しているので、画像は一般的に良い品質と焦点が合っています。
現在、APROX 600X500のウィンドウを使用してQRコードの周囲に画像をトリミングすると、pyzbar
でも確実に画像を検出して復号することができます。フルイメージを復号しようとすると、シンボルは検出/デコードされません。
トリミングウィンドウを画像にスライドさせるループを書いておき、各クロップフレームを別々にデコードしようとしました。ウィンドウの端にあるシンボルを見逃さないようにするには、ウィンドウを50%繰り返します。
また、検出/復号化のためにOpenCVを使用してみましたが、パフォーマンスはpyzbar
以上のものでした。
現在のプロジェクトに影響を与える問題
スライディングウィンドウのアプローチは調整するのが難しく、非効率的で遅いB/C:
このアプローチを使用する他のプロジェクトに影響を与える可能性がある問題:
QRコードのおおよその場所を見つけるにはどうやって見つけることができるので、それに応じて画像をトリミングできますか?
私は、検出/復号化性能を向上させるためのどんな解決策にも興味がありますが、(a)機械学習技術(私はML Newbieだが習得しても構わないと思っています)、(b)OpenCVイメージ前処理または(c私の基本的なトリミングアルゴリズムを改良します。
これが私がテストのために使用しているサンプル画像の1つです。最悪の場合のシナリオを近似するために意図的に照明品質が悪いですが、トリミングされたときに個々のコードはまだ正しく検出および復号されます。
この解決策は、それがむしろブルートフォースサイドにむしろ非常に非効率的ですが、次のように動作します。画像サイズは2000 x 2000、検出しきい値はおおよそ500 x 500で、バーコードサイズは110 x 110です。
理論的には、スライディングウィンドウのアプローチよりも優れていますが、おそらくそれはより多くの変動です。
アイデアは、イメージ内のバーコードを確実に見つけることができないが、イメージのサブセクション内でそれを見つけることができます。その後、画像をサブセクションに分割しようとすることができます。セクションに分割したときにバーコードが分割されないことがわかりませんので、通過して、可能なセクションの1つ以内になることを確認してください。
まず、画像を500 x 500グリッド(4 x 4)に分割し、それぞれのそれぞれにPyzbarを実行します。理論:バーコードはそれらの16のグリッドのうちの1つの内側にありますかそれともそれらのグリッドのうちの1つによって分割されています。
それがバーコードを見つけられない場合は、X軸上でグリッドを250倍にします。もう一度実行してから、Y軸上で250でグリッドオフセットを試してみて、XとY軸の両方で250を試して再度実行してください。理論的には、これはバーコードが存在することを確実にするべきですいくつか 500×500以下のグリッド。それでもうまくいかない場合は、250のバーコードサイズの2倍以上のバーコードサイズがまだ2倍以上の場合、代わりに250x250グリッドを使用することをお勧めします(もちろん4倍が長くなります)。
ここで提供されるその他の提案は、検索エリアを絞り込んで、バーコードを絶対に含めることも、バーコードを含むセクションに焦点を合わせることもできないセクションを廃棄するために使用できます。 Sebastianの答えは、どのグリッドの正方形を焦点を合わせるかを判断することにおいて、ややうまく機能する可能性があります。
別の選択肢は、バーコードがどこであるかを検討することであるかもしれませんが、バーコードが画面の中央に近づくと予想されます。そのため、内側に向かって螺旋状の検索パターンが役立つかもしれません。
すべてのQRコードでは、コーナーに3つの正方形/長方形があります。 OpenCVでそれらの部品を見つけることができれば、QRコード領域をトリミングすることが可能です。
私も見つかりました これは