python - Python-试图从图像中返回选定的轮廓。在某些轮廓上,它显示所选内容在轮廓之外
问题描述
我有一张图像,我在图像中找到了所有对象。然后我找到图像中的所有轮廓,并按区域大小对所有对象进行排序。然后,我在大于某个值的对象周围绘制轮廓,并根据从最大到最小的排序大小用数字标记对象。我正在尝试返回单击的轮廓。
我正在使用“pointPolygonTest”返回选定的对象。问题是在我选择的某些对象上工作正常,但是在我选择的某些对象上它不会返回所选对象。当我返回“pointPolygonTest”的值时,它返回一个“-1”,这意味着我正在单击轮廓外部,因此即使我单击的对象周围有轮廓边框,它也不会返回对象编号,并且显示对象编号的标签。我知道问题是我如何在仅围绕大于 300 区域大小的对象绘制之后引用新对象列表,但我似乎无法弄清楚。
这是问题所在的代码示例:
轮廓,层次结构 = cv.findContours(edges,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_NONE) sorted_contours= sorted(contours, key=cv.contourArea, reverse= True)
对于枚举(排序轮廓)中的(i,c):
M= cv.moments(c)
if M['m00'] !=0:
cx= int(M['m10']/M['m00'])
cy= int(M['m01']/M['m00'])
x,y,w,h = cv.boundingRect(c)
if (w*h) > 300:
cv.drawContours(img,sorted_contours, i, (255,0,255),2)
cv.putText(img, text= str(i+1), org=(cx-10,cy+5),
fontFace= cv.FONT_HERSHEY_SIMPLEX, fontScale=0.4, color=(100,255,255),thickness=1, lineType=cv.LINE_AA)
#newsortedcontours = c
否则:cx,cy = 0,0
def mouse_call_back(event, x, y, flags, param): global sampleselected if event == cv.EVENT_LBUTTONDOWN:
for i in range(0, len(sorted_contours)):
r = cv.pointPolygonTest(sorted_contours[i], (x, y), False)
print('r',r)
if r > 0:
print("Selected contour ", i+1)
sampleselected = i+1
cv.destroyWindow('selectaccept')
return sampleselected
else:
print(x,y)
我添加了图像以向您显示我要选择的对象是带圆圈的对象 (301)
解决方案
推荐阅读
- java - 使用 openFileInput(Uri) 和多线程打开多个文件
- r - 跨数据帧执行数学函数
- text - 使用 sed 命令删除特定行中的所有数字
- python - 如何计算一列的持续时间,按另一列(Python 或 R)分组
- python - 使用 Boto3/Python3 按列分隔将 s3 迭代写入 csv 文件
- javascript - 向 JS 文件动态添加参数(缓存清除)不会导致重新加载
- java - 休眠:如果某个字段存在某个值,则无法更新为新值
- python - toPandas() 会随着 pyspark 数据框变小而加快速度吗?
- c# - 如何在异步代码中处理 UnauthorizedAccessException?
- reactjs - 我可以在 React 中使用 id 来允许单个元素与酶 containsMatchingElement 匹配吗?