opencv Foundation 53-Bildkontur 06 – Beurteilung der Beziehung zwischen dem Pixelpunkt und der Kontur (innerhalb der Kontur, auf der Kontur, außerhalb der Kontur) cv2.pointPolygonTest()

Punkt-zu-Kontur-Abstand

In OpenCV wird die Funktion cv2.pointPolygonTest () verwendet, um den kürzesten Abstand (dh den
vertikalen Linienabstand) vom Punkt zum Polygon (Kontur) zu berechnen. Dieser Berechnungsprozess wird auch als Beziehungstest zwischen Punkt und Punkt bezeichnet Polygon. Das Syntaxformat dieser Funktion lautet:
retval = cv2.pointPolygonTest( Kontur, pt, MeasureDist)
Der Rückgabewert in der Formel ist retval, der sich auf den Wert des Parameters MeasureDist bezieht.
Die Parameter in der Formel lauten wie folgt:

  • Kontur ist die Kontur.
  • pt ist der zu bestimmende Punkt.
  • MeasureDist ist ein boolescher Wert, der angibt, wie die Entfernung bestimmt wird.
  • Wenn der Wert True ist, bedeutet dies, dass der Abstand vom Punkt zur Kontur berechnet wird. Liegt der Punkt außerhalb der Kontur, ist der Rückgabewert negativ; liegt der Punkt auf der Kontur, ist der Rückgabewert 0; liegt der Punkt innerhalb der Kontur, ist der Rückgabewert positiv.
  • Wenn der Wert „Falsch“ ist, wird der Abstand nicht berechnet und nur ein Wert zwischen „-1“, „0“ und „1“ zurückgegeben, der die Positionsbeziehung des Punkts relativ zur Kontur angibt. Liegt der Punkt außerhalb der Kontur, ist der Rückgabewert „-1“; liegt der Punkt auf der Kontur, ist der Rückgabewert „0“; liegt der Punkt innerhalb der Kontur, ist der Rückgabewert „1“.

Beispiel: Verwenden Sie die Funktion cv2.pointPolygonTest(), um den kürzesten Abstand von einem Punkt zu einer Kontur zu berechnen.

Verwenden Sie die Funktion cv2.pointPolygonTest(), um den kürzesten Abstand vom Punkt zur Kontur zu berechnen.需要将参数 measureDist 的值设置为 True。

Code wie folgt anzeigen:

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()

Operationsergebnis:

Fügen Sie hier eine Bildbeschreibung ein
Gleichzeitig zeigt das Programm folgende Ergebnisse an:

distA= 16.891650862259112
distB= -81.17585848021565
distC= -0.0

Aus den obigen Ergebnissen ist ersichtlich, dass

  • Der von Punkt A berechnete Abstand beträgt „16,891650862259112“, eine positive Zahl, die angibt, dass Punkt A innerhalb der Kontur liegt.
  • Der von Punkt B berechnete Abstand beträgt „-81,17585848021565“, was eine negative Zahl ist, die angibt, dass Punkt B außerhalb der Kontur liegt.
  • Der vom Punkt C berechnete Abstand beträgt „-0,0“, was bedeutet, dass Punkt C auf der Kontur liegt.

Wenn Sie im tatsächlichen Gebrauch die Punkte auf der Kontur erhalten möchten, können Sie diese durch Drucken des Konturpunktsatzes erhalten. In diesem Beispiel kann der Punkt auf der Kontur beispielsweise durch die Anweisung „print(hull)“ ermittelt werden. Nachdem der Punkt auf der Kontur ermittelt wurde, kann er als Parameter der Funktion cv2.pointPolygonTest() verwendet werden, um zu testen, ob der Rückgabewert der Funktion Null ist.

Beispiel 2: Verwenden Sie die Funktion cv2.pointPolygonTest(), um die Beziehung zwischen Punkten und Konturen zu beurteilen.

Code wie folgt anzeigen:

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()

Operationsergebnis:
Fügen Sie hier eine Bildbeschreibung ein

Gleichzeitig zeigt das Programm auch die folgenden Laufergebnisse an:

distA= 1.0
distB= -1.0
distC= 0.0

Aus den obigen Ergebnissen ist ersichtlich, dass

  • Der berechnete Beziehungswert von Punkt A ist „1“, was bedeutet, dass sich der Punkt innerhalb der Kontur befindet.
  • Der berechnete Beziehungswert von Punkt B ist „-1“, was anzeigt, dass der Punkt außerhalb der Kontur liegt.
  • Der berechnete Beziehungswert von Punkt C ist Null, was darauf hinweist, dass der Punkt auf der Kontur liegt.

In praktischen Anwendungen können wir diese Methode verwenden, um zu beurteilen, ob die von der Vorlage erkannten Pixelpunkte innerhalb eines bestimmten ROI-Bereichs liegen. Wir werden die spezifischen Anwendungsbeispiele und Codebeispiele im eigentlichen Kampfkapitel erläutern.

Ich denke du magst

Origin blog.csdn.net/hai411741962/article/details/132202254
Empfohlen
Rangfolge