使用 OpenCV 确定一个点是否在 ROI 内
Determine if a point is within ROI with OpenCV
我的objective是判断一个点是否在ROI内。我已经设法裁剪了一个 ROI,并且可以像这样访问它的宽度和高度
width = roi.shape[0] #total rows as width
height = roi.shape[1] #total columns as height
但是,我缺少 2 个额外的变量,它们是顶部和左侧坐标,以便构造以下语句来确定我的点是否存在于 ROI 中。
if(top < point_x < top + width and left < point_x < left + height)
感谢您的帮助和时间,谢谢。
您可以使用 cv2.pointPolygonTest()
来确定您的点是否存在于 ROI 内。
基本上你可以检查一个点是否在等高线内。函数 returns +1
、-1
或 0
分别表示一个点是在轮廓内部、外部还是轮廓上。由于您已经有了 ROI 坐标,您可以将其用作轮廓来检测该点是否在 ROI 内。这是一个找到圆形轮廓然后检查两个点是否在轮廓内的示例。
测试图片
找到轮廓和检查点后的图像
结果
point1 -1.0
point2 1.0
因此point1在等高线外,point2在等高线内。
import cv2
import numpy as np
image = cv2.imread('1.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
canny = cv2.Canny(gray, 120, 255, 1)
cnts = cv2.findContours(canny, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
point1 = (50, 50)
cv2.circle(image, point1, 8, (100, 100, 255), -1)
cv2.putText(image, 'point1', (point1[0] -10, point1[1] -20), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 0), lineType=cv2.LINE_AA)
point2 = (150, 150)
cv2.circle(image, point2, 8, (200, 100, 55), -1)
cv2.putText(image, 'point2', (point2[0] -10, point2[1] -20), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 0), lineType=cv2.LINE_AA)
for c in cnts:
cv2.drawContours(image, [c], -1, (36, 255, 12), 2)
res1 = cv2.pointPolygonTest(c, point1, False)
res2 = cv2.pointPolygonTest(c, point2, False)
print('point1', res1)
print('point2', res2)
cv2.imshow('image', image)
cv2.imwrite('image.png', image)
cv2.waitKey()
我的objective是判断一个点是否在ROI内。我已经设法裁剪了一个 ROI,并且可以像这样访问它的宽度和高度
width = roi.shape[0] #total rows as width
height = roi.shape[1] #total columns as height
但是,我缺少 2 个额外的变量,它们是顶部和左侧坐标,以便构造以下语句来确定我的点是否存在于 ROI 中。
if(top < point_x < top + width and left < point_x < left + height)
感谢您的帮助和时间,谢谢。
您可以使用 cv2.pointPolygonTest()
来确定您的点是否存在于 ROI 内。
基本上你可以检查一个点是否在等高线内。函数 returns +1
、-1
或 0
分别表示一个点是在轮廓内部、外部还是轮廓上。由于您已经有了 ROI 坐标,您可以将其用作轮廓来检测该点是否在 ROI 内。这是一个找到圆形轮廓然后检查两个点是否在轮廓内的示例。
测试图片
找到轮廓和检查点后的图像
结果
point1 -1.0
point2 1.0
因此point1在等高线外,point2在等高线内。
import cv2
import numpy as np
image = cv2.imread('1.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
canny = cv2.Canny(gray, 120, 255, 1)
cnts = cv2.findContours(canny, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
point1 = (50, 50)
cv2.circle(image, point1, 8, (100, 100, 255), -1)
cv2.putText(image, 'point1', (point1[0] -10, point1[1] -20), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 0), lineType=cv2.LINE_AA)
point2 = (150, 150)
cv2.circle(image, point2, 8, (200, 100, 55), -1)
cv2.putText(image, 'point2', (point2[0] -10, point2[1] -20), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 0), lineType=cv2.LINE_AA)
for c in cnts:
cv2.drawContours(image, [c], -1, (36, 255, 12), 2)
res1 = cv2.pointPolygonTest(c, point1, False)
res2 = cv2.pointPolygonTest(c, point2, False)
print('point1', res1)
print('point2', res2)
cv2.imshow('image', image)
cv2.imwrite('image.png', image)
cv2.waitKey()