如何使用opencv和Python在ROI中查找轮廓?

我试图在图像的特定区域找到轮廓。 是否有可能只显示ROI内的轮廓,而不显示图像其余部分的轮廓? 我在另一篇类似的文章中读到,我应该使用一个面具,但我不认为我正确使用它。 我新来openCV和Python,所以任何帮助都非常appriciated。

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)

既然你声称是新手,我已经制定了解决方案和插图。

考虑以下是你的原始图像:

假设以下红色区域是您感兴趣的区域(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中的按位AND操作,它专门用于掩蔽


为了在Python中设置ROI,需要使用标准的NumPy索引,例如在本例中。

因此,要选择正确的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)
链接地址: http://www.djcxy.com/p/89729.html

上一篇: How can I find contours inside ROI using opencv and Python?

下一篇: OpenCV set pixels outside ROI as the nearest pixel value inside the ROI