opencv foundation 53-imagen contorno 06-juzgar la relación entre el punto de píxel y el contorno (dentro del contorno, sobre el contorno, fuera del contorno) cv2.pointPolygonTest()

distancia punto a contorno

En OpenCV, la función cv2.pointPolygonTest() se usa para calcular la distancia más corta (es decir, la
distancia de la línea vertical) desde el punto hasta el polígono (contorno), este proceso de cálculo también se denomina prueba de relación entre el punto y el polígono. El formato de sintaxis de esta función es:
retval = cv2.pointPolygonTest( contorno, pt, medidaDist )
El valor devuelto en la fórmula es retval, que está relacionado con el valor del parámetro medidaDist.
Los parámetros en la fórmula son los siguientes:

  • contorno es el contorno.
  • pt es el punto a determinar.
  • medirDist es un valor booleano que indica la forma de determinar la distancia.
  • Cuando el valor es Verdadero, significa calcular la distancia desde el punto hasta el contorno. Si el punto está fuera del contorno, el valor devuelto es negativo; si el punto está en el contorno, el valor devuelto es 0; si el punto está dentro del contorno, el valor devuelto es positivo.
  • Cuando el valor es False, la distancia no se calcula y solo se devuelve un valor entre "-1", "0" y "1", que indica la relación posicional del punto con respecto al contorno. Si el punto está fuera del contorno, el valor devuelto es "-1"; si el punto está en el contorno, el valor devuelto es "0"; si el punto está dentro del contorno, el valor devuelto es "1".

Ejemplo: use la función cv2.pointPolygonTest() para calcular la distancia más corta desde un punto hasta un contorno.

Use la función cv2.pointPolygonTest() para calcular la distancia más corta desde el punto hasta el contorno,需要将参数 measureDist 的值设置为 True。

el código se muestra a continuación:

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

resultado de la operación:

inserte la descripción de la imagen aquí
Al mismo tiempo, el programa mostrará los siguientes resultados:

distA= 16.891650862259112
distB= -81.17585848021565
distC= -0.0

De los resultados anteriores se puede ver que,

  • La distancia calculada desde el punto A es "16.891650862259112", que es un número positivo que indica que el punto A está dentro del contorno.
  • La distancia calculada desde el punto B es "-81.17585848021565", que es un número negativo que indica que el punto B está fuera del contorno.
  • La distancia calculada desde el punto C es "-0.0", lo que indica que el punto C está en el contorno.

En el uso real, si desea obtener los puntos del contorno, puede obtenerlos imprimiendo el conjunto de puntos del contorno. Por ejemplo, en este ejemplo, el punto en el contorno se puede obtener mediante la declaración "imprimir (casco)". Después de obtener el punto en el contorno, se puede usar como parámetro de la función cv2.pointPolygonTest() para probar si el valor de retorno de la función es cero.

Ejemplo 2: Use la función cv2.pointPolygonTest() para juzgar la relación entre puntos y contornos.

el código se muestra a continuación:

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

resultado de la operación:
inserte la descripción de la imagen aquí

Al mismo tiempo, el programa también mostrará los siguientes resultados de ejecución:

distA= 1.0
distB= -1.0
distC= 0.0

De los resultados anteriores se puede ver que,

  • El valor de relación calculado del punto A es "1", lo que indica que el punto está dentro del contorno.
  • El valor de relación calculado del punto B es "-1", lo que indica que el punto está fuera del contorno.
  • El valor de relación calculado del punto C es cero, lo que indica que el punto está en el contorno.

En aplicaciones prácticas, podemos usar este método para juzgar si los puntos de píxel detectados por la plantilla están dentro de un área de ROI específica. Explicaremos los ejemplos de aplicación específicos y los ejemplos de código en el capítulo de combate real.

Supongo que te gusta

Origin blog.csdn.net/hai411741962/article/details/132202254
Recomendado
Clasificación