首页 > 解决方案 > 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)

对象样本

标签: python

解决方案


推荐阅读