我想有一个感兴趣的多边形区域,并想在这个区域内执行一个目标检测算法.

例如,用户给出一些点,我想在代码中用它们创建一个多边形(如红色区域),我想在红色区域内执行我的目标检测代码.

问题是如何在该区域内搜索对象,以及如何实现定义输入和输出区域的if条件?

有没有有效的方法在Python中实现这一点?

enter image description here

推荐答案

据我所知,你试图区分外部轮廓和内部轮廓.要确定哪些轮廓在内外,只需使用轮廓层次来区分两者.具体来说,当使用cv2.findContours时,可以使用cv2.RETR_TREE来提取外部或内部轮廓.完整解释见understanding contour hierarchies: how to distinguish between contours.从我们给出的完整拓Flutter 图中,我们可以过滤出轮廓,其 idea 是,如果父轮廓有内部轮廓,这意味着它是OUT轮廓,内部的子轮廓是IN轮廓.另一种情况是,如果一个轮廓没有内部子对象,那么我们知道它是一个IN轮廓.

以下是一个例子:

输入图像

enter image description here

后果

enter image description here

密码

import cv2

# Load image, grayscale, Otsu's threshold
image = cv2.imread('2.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

# Filter using contour hierarchy
cnts, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[-2:]
hierarchy = hierarchy[0]
for component in zip(cnts, hierarchy):
    currentContour = component[0]
    currentHierarchy = component[1]
    x,y,w,h = cv2.boundingRect(currentContour)
    # Has inner contours which means it is IN
    if currentHierarchy[2] < 0:
        cv2.putText(image, 'IN', (x,y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (36,255,12), 2)
    # No child which means it is OUT
    elif currentHierarchy[3] < 0:
        cv2.putText(image, 'OUT', (x,y-5), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (36,255,12), 2)

cv2.imshow('image', image)
cv2.waitKey()

Python相关问答推荐

云上Gunicorn的Flask-socketIO无法工作

Plotly:如何更改Heatmap中彩色条的勾选文本

实现的差异取决于计算出的表达是直接返回还是首先存储在变量中然后返回

在for循环中仅执行一次此操作

拆分pandas列并创建包含这些拆分值计数的新列

Pandas :多索引组

有条件地采样我的大型DF的最有效方法

连接两个具有不同标题的收件箱

如何使用html从excel中提取条件格式规则列表?

如何找到满足各组口罩条件的第一行?

2D空间中的反旋算法

图像 pyramid .难以创建所需的合成图像

利用Selenium和Beautiful Soup实现Web抓取JavaScript表

迭代嵌套字典的值

Odoo 16使用NTFS使字段只读

将标签移动到matplotlib饼图中楔形块的开始处

python—telegraph—bot send_voice发送空文件

ruamel.yaml dump:如何阻止map标量值被移动到一个新的缩进行?

Python—压缩叶 map html作为邮箱附件并通过sendgrid发送

获取PANDA GROUP BY转换中的组的名称