【问题标题】:How can I find contours inside ROI using opencv and Python?如何使用 opencv 和 Python 在 ROI 内找到轮廓?
【发布时间】:2021-03-11 10:37:11
【问题描述】:

我试图在图像的特定区域中找到轮廓。是否可以只显示 ROI 内的轮廓而不是图像其余部分的轮廓?我在另一篇类似的帖子中读到我应该使用口罩,但我认为我没有正确使用它。我是 openCV 和 Python 的新手,因此非常感谢任何帮助。

import numpy as np
import cv2

cap = cv2.VideoCapture('size4.avi')
x, y, w, h= 150, 50, 400 ,350
roi = (x, y, w, h)

while(True): 
    ret, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    _, thresh = cv2.threshold(gray, 127, 255, 0)
    im2, contours, hierarchy = cv2.findContours(thresh,    cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

    roi = cv2.rectangle(frame, (x,y), (x+w, y+h), (0,0,255), 2)
    mask = np.zeros(roi.shape,np.uint8)
    cv2.drawContours(mask, contours, -1, (0,255,0), 3)

    cv2.imshow('img', frame)

【问题讨论】:

    标签: python opencv roi


    【解决方案1】:

    由于你自称是新手,我已经制定了解决方案并附上插图。

    将以下图像视为您的原始图像:

    假设以下红色区域是您的感兴趣区域 (ROI),您希望在其中找到轮廓:

    首先,构建一个相同大小的黑色像素的图像。 必须相同尺寸:

    black = np.zeros((img.shape[0], img.shape[1], 3), np.uint8) #---black in RGB
    

    现在形成蒙版并突出显示 ROI:

    black1 = cv2.rectangle(black,(185,13),(407,224),(255, 255, 255), -1)   #---the dimension of the ROI
    gray = cv2.cvtColor(black,cv2.COLOR_BGR2GRAY)               #---converting to gray
    ret,b_mask = cv2.threshold(gray,127,255, 0)                 #---converting to binary image
    

    现在用您的原始图像掩盖上面的图像:

    fin = cv2.bitwise_and(th,th,mask = mask)
    

    现在使用cv2.findContours() 查找上图中的轮廓。

    然后使用cv2.drawContours()在原图上绘制轮廓。您最终将获得以下内容:

    可能还有更好的方法,但这样做是为了让您了解 OpenCV 中的 按位与 操作,它专门用于 ma​​sking

    【讨论】:

    • 我提供这个解决方案是因为您想知道如何在图像中执行遮罩。关键是要高效使用函数cv2.bitwise_and()
    • 是的,这是了解如何遮罩的好方法,谢谢 ;) 一个小的后续问题:当我绘制轮廓时,我还会在 ROI 的框架周围得到一个轮廓以及里面的轮廓,这应该发生吗?我看到你的例子中没有它。
    • 如果您没有反转图像,可能会发生这种情况
    【解决方案2】:

    为了在 Python 中设置 ROI,可以使用标准 NumPy 索引such as in this example

    因此,要选择正确的 ROI,您不使用 cv2.rectangle 函数(即用于绘制矩形),而是这样做:

     _, thresh = cv2.threshold(gray, 127, 255, 0)
     roi = thresh[x:(x+w), y:(y+h)]
     im2, contours, hierarchy = cv2.findContours(roi, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
    

    【讨论】:

    • 您可以将矩形的偏移量传递给findContours,以便检索到的轮廓点参考原图
    • 谢谢,当我改变了我写 roi 的方式时,它起作用了。我将如何像您建议的 Miki 那样偏移矩形?
    • 文档:docs.opencv.org/2.4/modules/imgproc/doc/… 说函数的最后一个参数是一个指定偏移量的元组;即:im2, contours, hierarchy = cv2.findContours(roi, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE, (x, y))
    猜你喜欢
    • 2020-03-28
    • 2016-09-25
    • 2012-02-25
    • 2021-09-07
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    相关资源
    最近更新 更多