[opencv]等高線:より多くのプロパティ(凸包の偏差:凸包、点から等高線までの最短距離、2つの形状または2つの等高線を比較し、類似性を示すメジャーを返します)

4_9_4_Contour:その他の属性-OpenCV中国語の公式ドキュメント

学習します-凸状の欠陥とそれらを見つける方法-点からポリゴンまでの最短距離を見つけます-さまざまな形状に一致します

理論とコード

1.凸面欠陥

等高線の第2章で凸包を見ました。この凸包からの逸脱は、凸包欠陥と見なすことができます。OpenCVには、これを見つける関数cv.convexityDefects()があります。基本的な関数呼び出しは次のとおりです。

hull = cv.convexHull(cnt,returnPoints = False)
defects = cv.convexityDefects(cnt,hull)

 凸包returnPoints= Falseを見つけるときは、凸包を見つけるために合格する必要があることに注意してください。

各行にこれらの値が含まれる配列を返します- [開始、終了、最も遠い点、最も遠い点までのおおよその距離]画像で視覚化できます。始点と終点を結ぶ線を引き、最も遠い点に円を描きます。返される最初の3つの値はcntのインデックスであることを忘れないでください。したがって、これらの値をcntから取得する必要があります。

import cv2 as cv
import numpy as np
img = cv.imread('star.jpg')
img_gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
ret,thresh = cv.threshold(img_gray, 127, 255,0)
contours,hierarchy = cv.findContours(thresh,2,1)
cnt = contours[0]
hull = cv.convexHull(cnt,returnPoints = False)
defects = cv.convexityDefects(cnt,hull)
for i in range(defects.shape[0]):
    s,e,f,d = defects[i,0]
    start = tuple(cnt[s][0])
    end = tuple(cnt[e][0])
    far = tuple(cnt[f][0])
    cv.line(img,start,end,[0,255,0],2)
    cv.circle(img,far,5,[0,0,255],-1)
cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()

結果の表示:

2.ポイントポリゴンテスト

この関数は、画像内のます。距離を返します。これは、ポイントが輪郭の外側にある場合は負、ポイントが輪郭の内側にある場合は正、ポイントが輪郭上にある場合はゼロになります

たとえば、(50,50)次のようにチェックポイントを設定できます。

dist = cv.pointPolygonTest(cnt,(50,50),True)

関数では、3番目のパラメーターはmeasureDistです。それが本当なら、それは符号付き距離を見つけます。falseの場合、ポイントが等高線の内側にあるか外側にあるかを検出します(それぞれ、+ 1、-1、および0を返します)。

 距離を見つけたくない場合は、3番目のパラメーターがFalseであることを確認してください。これは、時間のかかるプロセスです。したがって、Falseに設定すると、2〜3倍速くなります。

3.形状マッチング

OpenCVには、 2つの形状または2つの輪郭を比較し、類似性を示すメジャーを返すことができる関数** cv.matchShapes **()が付属しています

結果が低いほど、一致度は高くなります。モーメント値から計算されます。

さまざまな測定方法は、ドキュメントで説明されています。

import cv2 as cv
import numpy as np
img1 = cv.imread('star.jpg',0)
img2 = cv.imread('star2.jpg',0)
ret, thresh = cv.threshold(img1, 127, 255,0)
ret, thresh2 = cv.threshold(img2, 127, 255,0)
contours,hierarchy = cv.findContours(thresh,2,1)
cnt1 = contours[0]
contours,hierarchy = cv.findContours(thresh2,2,1)
cnt2 = contours[0]
ret = cv.matchShapes(cnt1,cnt2,1,0.0)
print( ret )

以下に示すさまざまな形状に一致する形状を試しました。

次の結果が得られます。-画像Aとそれ自体の一致=0.0-画像Aと画像Bの一致=0.001946-画像Aと画像Cの一致=0.326911

ほら、画像の回転でさえ、この比較では大きな違いはありません。

参照 Huモーメントは、平行移動、回転、およびスケールに対して不変の7つのモーメントです。7番目はゆがんでいない量です。これらの値は、** cpu.HuMoments **()関数を使用して見つけることができます。

おすすめ

転載: blog.csdn.net/dujuancao11/article/details/122429162