web-dev-qa-db-ja.com

2つの類似した形状間のOpenCV形状マッチング

少し不規則な形状を形状のデータベースに一致させようとしています。たとえば、ここで私が一致させようとしている輪郭は次のとおりです。

enter image description here

詳細については、これはHDMIコネクタの輪郭であり、輪郭として表されています。これはHDMIを持ったまま携帯電話で撮ったものなので少しラフです。

これは私のコネクタのデータベースです:

HDMI: enter image description here

DVI: enter image description here

5PinDIN: enter image description here

DB25: enter image description here

これらはインターネットからのコネクタ画像から収集された輪郭であるため、これらははるかに明確です。

私が試したことについて:

cv2.matchShapes()

これらはすべて単なる輪郭であるため、matchShapes()メソッドを使用して直接比較しようとしましたが、良好な結果が得られませんでした。不規則な輪郭と私のデータベースの類似点は次のとおりです。

HDMI:0.90

DB25:0.84

5ピンDIN:0.5

DVI:0.21

一致結果が0に近いほど等高線が似ているため、アルゴリズムは完全に失敗しました。 3番目のパラメーターを変更して他のマッチング方法を試しましたが、それでも失敗しました。

ORB:

SIFTに似ているので、キーポイントマッチングを試しました。データベース内の異なる一致間の距離の平均化(一致の上位15%を見つけた後):

mean([m.distance for m in matches])

距離は次のようになりました:

5ピンDIN:7.6

DB25:11.7

DVI:12.1

HDMI:19.6

これは私の輪郭に最も似た形として円を分類したので、これも失敗しました。

詳細については、実際のHDMIスロットと私の例のHDMIスロットのORBからの一致するキーポイントを次に示します。 enter image description here

私が試すべきアイデア/他のアルゴリズムはありますか?または、CNNが私の唯一の選択肢です(適切な量のデータがないため、避けたいと思います)。

3
Cyon

この一連の画像の簡単な答えは、OpenCV matchShapesメソッドI2を使用し、より小さな「eps」でメソッドmatchShapesを再コーディングすることです。 double eps = 1.e-20;は十分に小さいです。

私は高校のロボット工学チームのメンターであり、OpenCVのmatchShapesは、ロボットのビジョンを改善するために必要なものだと思いました(スケール、平行移動、回転は不変で、学生は既存のOpenCVコードで簡単に使用できます)。私は私の研究の数時間後にこの記事に出くわしました、そしてこれは恐ろしいことでした!これらの結果を考えると、matchShapesはどのように機能するでしょうか?私はこれらの悪い結果について信じられませんでした。

私は自分のmatchShapesをコーディングして(Java-これは学生が使いたかったものです)、eps(log10関数をゼロから保護し、防止する小さな値)を変更した場合の影響を確認しました。それらを完全一致と呼ぶことによる大きな不一致-実際とは逆です。値の根拠が見つかりませんでした)。matchShapesepsをOpenCV番号1.e-5から1.e-20に変更し、良い結果ですが、それでもプロセスは当惑しています。

正しい答えがあれば、それを取得するプロセスをゆがめることができるのは素晴らしいことですが、怖いです。添付の画像には、Hu Moment比較の3つの方法がすべて含まれており、方法2と3はかなりうまく機能しています。

私のプロセスは、上記の画像を保存し、バイナリ1チャネルに変換し、拡張1、侵食1、findCountours、eps = 1.e-20のmatchShapesでした。

方法2、HDMIをそれ自体でターゲット= 0.、HDMI = 1.15、DVI = 11.48、DB25 = 27.37、DIN = 74.82 
方法3、HDMIをそれ自体でターゲット= 0.、HDMI = 0.34 、DVI = 0.48、DB25 = 2.33、DIN = 3.29 

等高線とHuモーメントの比較-matchShapes 3メソッド

私は素朴な調査を続け(統計の背景はほとんどありません)、正規化と比較を行うための他のさまざまな方法を見つけました。ピアソン相関係数や他の共分散法の詳細を理解できず、おそらくそれらは適切ではありません。さらに2つの正規化方法ともう1つのマッチング方法をテストしました。

OpenCVは、一致する3つの計算すべてについてLog10関数で正規化します。

Huモーメントの各ペアを各ペアの最大値max(Ai、Bi)に対する比率で正規化してみました。また、各ペアをベクトル長1(2乗和のsqrtで除算)に正規化してみました。

コサインシータ法を使用して7次元Huモーメントベクトル間の角度を計算する前、およびOpenCV法I2と同様に要素ペアの差の合計を計算する前に、これら2つの新しい正規化を使用しました。

私の4つの新しい調合はうまく機能しましたが、値の範囲が小さく、同じ順序であったことを除いて、「修正された」epsでopenCVI2以外には何も貢献しませんでした。

I3メソッドは対称ではないことに注意してください。matchShapes引数の順序を入れ替えると、結果が変わります。この一連の画像では、最初の引数として「不明」の瞬間を置き、2番目の引数として既知の形状のリストと比較して最良の結果を得ます。逆にすると、結果が「間違った」答えに変わります。

私が試みたマッチング方法の数7は、Huモーメントの数-7と偶然の一致にすぎません。

 7つの異なる計算のマッチングインデックスの説明
 | Id |正規化|マッチングインデックスの計算|最良の値| 
 |-| --------- ---------------- | --------------------------------- | ---------- | 
 | I1 | OpenCVログ|合計要素ペアの逆数diff | 0 | 
 | I2 | OpenCVログ|合計要素ペアのdiff | 0 | 
 | I3 | OpenCVログ| A差に対する最大分数| 0 | 
 | T4 |要素ペアの最大比|ベクトル余弦角| 1 | 
 | T5 |単位ベクトル|ベクトルコサイン角| 1 | 
 | T6 |要素ペアの最大比|要素ペアの合計diff | 0 | 
 | T7 |単位ベクトル|要素ペアの合計diff | 0 | 
 
 5つの画像のそれぞれについて7つの異なる計算のインデックス結果を一致させる
 | | I1 | I2 | I3 | T4 | T5 | T6 | T7 | 
 | --------------- | ----- | ----- | ----- | ----- |- --- | ----- | ----- | 
 | HDMI 0 | 1.13 | 1.15 | 0.34 | 0.93 | 0.92 | 2.02 | 1.72 | 
 | DB25 1 | 1.37 | 27.37 | 2.33 | 0.36 | 0.32 | 5.79 | 5.69 | 
 | DVI 2 | 0.36 | 11.48 | 0.48 | 0.53 | 0.43 | 5.06 | 5.02 | 
 | DIN5 3 | 1.94 | 74.82 | 3.29 | 0.38 | 0.34 | 6.39 | 6.34 | 
 |不明(HDMI)4 | 0.00 | 0.00 | 0.00 | 1.00 | 1.00 | 0.00 | 0.00 |(この画像はそれ自体と一致します)

[matchShapesのこの弱点に対処するためにOpenCVの問題16997を作成しました。]

1
Tommy131313