概要
cv2.matchShape() で 2 つの輪郭の類似度を算出し、マッチングを行う方法について解説します。
cv2.matchShape
引数
名前 | 型 | デフォルト値 |
---|---|---|
contour1 | ndarray | |
比較する輪郭 | ||
contour2 | ndarray | |
比較する輪郭 | ||
method | int (ShapeMatchModes) | |
比較方法 | ||
parameter | float | |
比較方法に関するパラメータ (現在は使用されていない) |
返り値
名前 | 説明 | ||
---|---|---|---|
retval | 類似度 |
サンプルコード

In [1]:

サンプル画像の図形には以下の特徴があります。
- No0 と No1 は形状と大きさが同じですが、角度が異なります。
- No4 と No5 は形状が同じですが、大きさと角度が異なります。
cv2.matchShapes()
は、2 つの輪郭を渡すとその類似度を返します。類似度は小さいほど、形状がより似ていることを意味します。各輪郭同士の類似度を計算し、 を輪郭 と輪郭 の類似度を表す行列としてまとめてみます。
In [2]:

対角成分 は同じ輪郭同士の比較なので、類似度は 0 になります。2 つの輪郭が近いほど類似度は 0 に近くなるため、ある閾値を設定し、その値未満の類似度を持つ輪郭同士を同一であると判定することができます。
In [3]:
輪郭0 vs 輪郭1: 類似度: 0.02 輪郭4 vs 輪郭5: 類似度: 0.00
その結果、No0 と No1、No4 と No5 が同じ輪郭であると判定されました。
比較方法 – method
輪郭の類似度を算出する際、スケール、位置、回転に不変な 7 つの要素で表される HuMoments を各輪郭に対して計算し、その HuMoments の距離を算出します。この距離の計算方法は method 引数で指定できます。
2 つの輪郭 が与えられたとき、それぞれの HuMoments を とします。
HuMoments の値に対して、以下のように定義された距離指標が使用されます。
cv2.CONTOURS_MATCH_I1
cv2.CONTOURS_MATCH_I2
cv.CONTOURS_MATCH_I3
ここで、 です。
コメント