opencv foundation 53-image contour 06-juger la relation entre le point de pixel et le contour (à l'intérieur du contour, sur le contour, à l'extérieur du contour) cv2.pointPolygonTest()

distance point à contour

Dans OpenCV, la fonction cv2.pointPolygonTest() est utilisée pour calculer la distance la plus courte (c'est-à-dire la
distance de la ligne verticale) du point au polygone (contour), ce processus de calcul est également appelé le test de relation entre le point et le polygone. Le format de syntaxe de cette fonction est :
retval = cv2.pointPolygonTest( contour, pt, measureDist )
La valeur de retour dans la formule est retval, qui est liée à la valeur du paramètre measureDist.
Les paramètres de la formule sont les suivants :

  • contour est le contour.
  • pt est le point à déterminer.
  • measureDist est une valeur booléenne, indiquant la manière de déterminer la distance.
  • Lorsque la valeur est True, cela signifie calculer la distance entre le point et le contour. Si le point est à l'extérieur du contour, la valeur de retour est négative ; si le point est sur le contour, la valeur de retour est 0 ; si le point est à l'intérieur du contour, la valeur de retour est positive.
  • Lorsque la valeur est False, la distance n'est pas calculée et seule une valeur parmi "-1", "0" et "1" est renvoyée, indiquant la relation de position du point par rapport au contour. Si le point est à l'extérieur du contour, la valeur de retour est "-1" ; si le point est sur le contour, la valeur de retour est "0" ; si le point est à l'intérieur du contour, la valeur de retour est "1".

Exemple : Utilisez la fonction cv2.pointPolygonTest() pour calculer la distance la plus courte entre un point et un contour.

Utilisez la fonction cv2.pointPolygonTest() pour calculer la distance la plus courte du point au contour,需要将参数 measureDist 的值设置为 True。

code afficher comme ci-dessous:

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

résultat de l'opération :

insérez la description de l'image ici
En même temps, le programme affichera les résultats suivants :

distA= 16.891650862259112
distB= -81.17585848021565
distC= -0.0

D'après les résultats ci-dessus, on peut voir que,

  • La distance calculée à partir du point A est "16,891650862259112", qui est un nombre positif, indiquant que le point A est à l'intérieur du contour.
  • La distance calculée à partir du point B est "-81,17585848021565", qui est un nombre négatif, indiquant que le point B est en dehors du contour.
  • La distance calculée à partir du point C est "-0.0", indiquant que le point C est sur le contour.

En utilisation réelle, si vous souhaitez obtenir les points sur le contour, vous pouvez l'obtenir en imprimant le jeu de points du contour. Par exemple, dans cet exemple, le point sur le contour peut être obtenu par l'expression "empreinte(coque)". Après avoir obtenu le point sur le contour, il peut être utilisé comme paramètre de la fonction cv2.pointPolygonTest() pour tester si la valeur de retour de la fonction est zéro.

Exemple 2 : Utilisez la fonction cv2.pointPolygonTest() pour évaluer la relation entre les points et les contours.

code afficher comme ci-dessous:

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

résultat de l'opération :
insérez la description de l'image ici

En même temps, le programme affichera également les résultats d'exécution suivants :

distA= 1.0
distB= -1.0
distC= 0.0

D'après les résultats ci-dessus, on peut voir que,

  • La valeur de relation calculée du point A est "1", indiquant que le point est à l'intérieur du contour.
  • La valeur de relation calculée du point B est "-1", indiquant que le point est à l'extérieur du contour.
  • La valeur de relation calculée du point C est zéro, indiquant que le point est sur le contour.

Dans les applications pratiques, nous pouvons utiliser cette méthode pour juger si les points de pixel détectés par le modèle se trouvent dans une zone ROI spécifiée. Nous expliquerons les exemples d'application spécifiques et les exemples de code dans le chapitre sur le combat proprement dit.

Je suppose que tu aimes

Origine blog.csdn.net/hai411741962/article/details/132202254
conseillé
Classement