opencv基礎53-画像輪郭06-画素点と輪郭の関係判定(輪郭内、輪郭上、輪郭外) cv2.pointPolygonTest()

点から輪郭までの距離


OpenCV では、関数 cv2.pointPolygonTest()を使用して、点からポリゴン (輪郭) までの最短距離 (つまり、垂直線の距離) を計算します。この計算プロセスは、点とポリゴン間の関係テストとも呼ばれます。ポリゴン。この関数の構文形式は次のとおりです。
retval = cv2.pointPolygonTest( contour, pt, measureDist )
式の戻り値は retval で、これはパラメーターmeasureDist の値に関連します。
式のパラメータは次のとおりです。

  • 輪郭は輪郭です。
  • ptは決定すべきポイントです。
  • measureDist はブール値で、距離を決定する方法を示します。
  • 値が True の場合、点から輪郭までの距離を計算することを意味します。点が輪郭の外側にある場合、戻り値は負の値、点が輪郭上にある場合、戻り値は 0、点が輪郭の内側にある場合、戻り値は正の値です。
  • 値が False の場合、距離は計算されず、輪郭に対する点の位置関係を示す「-1」、「0」、「1」の値のみが返されます。点が輪郭の外側にある場合、戻り値は「-1」、点が輪郭上にある場合、戻り値は「0」、点が輪郭の内側にある場合、戻り値は「1」です。

例: 関数 cv2.pointPolygonTest() を使用して、点から輪郭までの最短距離を計算します。

関数 cv2.pointPolygonTest() を使用して、点から輪郭までの最短距離を計算します。需要将参数 measureDist 的值设置为 True。

コードは以下のように表示されます。

import cv2
#----------------原始图像-------------------------
o = cv2.imread('cs.bmp')
cv2.imshow("original",o)
#----------------获取凸包------------------------
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary,
 cv2.RETR_LIST,
 cv2.CHAIN_APPROX_SIMPLE)
hull = cv2.convexHull(contours[0])

cv2.polylines(o, [hull], True, (0, 255, 0), 2)
#----------------内部点 A 到轮廓的距离-------------------------
distA = cv2.pointPolygonTest(hull, (300, 150), True)
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(o,'A',(300,150), font, 1,(0,255,0),2)
print("distA=",distA)
#----------------外部点 B 到轮廓的距离-------------------------
distB = cv2.pointPolygonTest(hull, (300, 250), True)
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(o,'B',(300,250), font, 1,(0,255,0),2)
print("distB=",distB)
#------------正好处于轮廓上的点 C 到轮廓的距离-----------------
distC = cv2.pointPolygonTest(hull, (423, 112), True)
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(o,'C',(423,112), font, 1,(0,255,0),2)
print("distC=",distC)

#----------------显示-------------------------
cv2.imshow("result1",o)
cv2.waitKey()
cv2.destroyAllWindows()

操作結果:

ここに画像の説明を挿入
同時に、プログラムは次の結果を表示します。

distA= 16.891650862259112
distB= -81.17585848021565
distC= -0.0

上記の結果から次のことがわかります。

  • 点 A から計算された距離は「16.891650862259112」で、これは正の数であり、点 A が輪郭の内側にあることを示します。
  • 点 B から計算された距離は「-81.17585848021565」であり、これは負の数であり、点 B が輪郭の外側にあることを示します。
  • 点 C から計算された距離は「-0.0」であり、点 C が輪郭上にあることを示します。

実際の使用において、輪郭上の点を取得したい場合は、輪郭点セットを印刷することで取得できます。たとえば、この例では、輪郭上の点は、ステートメント「print(hull)」によって取得できます。輪郭上の点を取得した後、関数 cv2.pointPolygonTest() のパラメーターとして使用して、関数の戻り値がゼロかどうかをテストできます。

例 2: 関数 cv2.pointPolygonTest() を使用して、点と輪郭の関係を判断します。

コードは以下のように表示されます。

import cv2
#----------------原始图像-------------------------
o = cv2.imread('cs.bmp')
cv2.imshow("original",o)
#----------------获取凸包------------------------
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary,
 cv2.RETR_LIST,
cv2.CHAIN_APPROX_SIMPLE)
hull = cv2.convexHull(contours[0])
image = cv2.cvtColor(gray,cv2.COLOR_GRAY2BGR)
cv2.polylines(image, [hull], True, (0, 255, 0), 2)
#----------------内部点 A 与轮廓的关系-------------------------
distA = cv2.pointPolygonTest(hull, (300, 150),False)
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(image,'A',(300,150), font, 1,(0,255,0),3)
print("distA=",distA)
#----------------外部点 B 与轮廓的关系-------------------------
distB = cv2.pointPolygonTest(hull, (300, 250), False)
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(image,'B',(300,250), font, 1,(0,255,0),3)
print("distB=",distB)
#----------------边缘线上的点 C 与轮廓的关系----------------------
distC = cv2.pointPolygonTest(hull, (423, 112),False)
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(image,'C',(423,112), font, 1,(0,255,0),3)

print("distC=",distC)
#----------------显示-------------------------
cv2.imshow("result",image)
cv2.waitKey()
cv2.destroyAllWindows()

操作結果:
ここに画像の説明を挿入

同時に、プログラムは次の実行結果も表示します。

distA= 1.0
distB= -1.0
distC= 0.0

上記の結果から次のことがわかります。

  • 点 A の計算された関係値は「1」であり、点が輪郭の内側にあることを示します。
  • 点 B の計算された関係値は「-1」で、点が輪郭の外側にあることを示します。
  • 点 C の計算された関係値は 0 であり、点が輪郭上にあることを示します。

実際の応用では、テンプレートで検出した画素点が指定した ROI 領域内にあるかどうかを判定するためにこの方法を利用することができますが、その具体的な応用例とコード例については実戦編で説明します。

おすすめ

転載: blog.csdn.net/hai411741962/article/details/132202254