当前位置:网站首页>Opencv judgment points are inside and outside the polygon

Opencv judgment points are inside and outside the polygon

2022-07-05 22:19:00 alex1801

         be based on Python and OpenCV Draw a polygon , And judge whether a point is in the polygon .

1、cv2.pointPolygonTest() function

         Function definition :cv2.pointPolygonTest(contour, pt, measureDist)

         The functionality : Find the shortest distance between the point and the contour in the image . The distance it returns is negative when the point is outside the contour , When the point is positive in the contour , If it is 0.

         among ,contour Is a contour polygon ;pt It's a coordinate point ;measureDist, if True, Is to find the signed distance ; if False, I will find out whether it is included , Outside , Or contour ( Corresponding return +1, -1, 0).

The test case :

import cv2

mask = cv2.imread(r"mask.jpg", 0)
mask[mask > 100] = 255
mask[mask != 255] = 0

cnts, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
print("mask info:", mask.shape, len(cnts))

pt0 = (131, 104)  #  External point ,  Red 
pt1 = (166, 157)  #  Points on the outline 
pt2 = (260, 170)  #  Inside point 
img = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)
img = cv2.circle(img, pt0, 2, (0, 0, 255), 2)  #  Red 
img = cv2.circle(img, pt1, 2, (0, 255, 0), 2)  #  green 
img = cv2.circle(img, pt2, 2, (255, 0, 0), 2)  #  Blue 

dst0 = cv2.pointPolygonTest(cnts[0], pt0, 1)
dst1 = cv2.pointPolygonTest(cnts[0], pt1, 1)
dst2 = cv2.pointPolygonTest(cnts[0], pt2, 1)
print("dst:", dst0, dst1, dst2)
cv2.imwrite(r"ret.jpg", img)

test result :

dst: -58.52 2.82 44.28

Images :

2、cv2.polylines() function

Function definition :img = cv2.polylines(img, pts, isClosed, color, thickness, lineType, shift)

among :

        pts It is a matrix composed of polygon fixed points , Connect the incoming points once .

        isClosed - Indicates whether the drawn polygon is closed . If closed (True), Then the last vertex of each curve is connected to the first vertex , If not closed (False), Then the polygon is not closed .

Sample code :

import cv2
import numpy as np

#  Pure white image 
img = np.zeros((500, 500, 3), np.uint8)
img[:] = [255, 255, 255]

#  Four vertex coordinates 
pts = np.array([[100, 100], [200, 20], [370, 6], [450, 200]], np.int32)
#  Number of vertices :4, Matrix becomes 4*1*2 dimension 
pts = pts.reshape((-1, 1, 2))  # (4,1,2)
cv2.polylines(img, [pts], isClosed=True, color=(0, 0, 255), thickness=3)
cv2.imwrite(r"a.jpg", img)

result :

3、 Key code

#  Four vertex coordinates 
pts = np.array([[100, 100], [200, 20], [370, 6], [450, 200]], np.int32)

#  Number of vertices :4, Matrix becomes 4*1*2 dimension 
pts = pts.reshape((-1, 1, 2))  # (4,1,2)

#  Draw a polygon 
img = cv2.polylines(img, [pts], isClosed=True, color=(0, 0, 255), thickness=3)

#  Test the distance between the point and the polygon 
dist = cv2.pointPolygonTest(pts, (307, 100), True)

Extended reading :

1、opencv python outline / Convex defect /PointPolygonTest/ Shape match

opencv python outline / Convex defect /PointPolygonTest/ Shape match - SegmentFault Think no

         Shape match :

        OpenCV With a function cv2.matchShapes(), It allows us to compare two shapes or two outlines , And return a measure that shows similarity . The lower the result , The better the match . It is based on hu-moment Calculated by value .

        ret = cv2.matchShapes(cnt1,cnt2,1,0.0)

2、 Better than opencv special column

https://blog.csdn.net/kakiebu/category_7398390.html

原网站

版权声明
本文为[alex1801]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/186/202207052217131952.html