如何使用 opencv 和 Python 在 ROI 内找到轮廓?
How can I find contours inside ROI using opencv and Python?
我正在尝试在图像的特定区域中查找轮廓。是否可以只显示 ROI 内的轮廓而不显示图像其余部分的轮廓?我在另一个类似的 post 中读到我应该使用面具,但我认为我没有正确使用它。我是 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 中设置 ROI,我们使用标准 NumPy 索引 such as in this example。
因此,为了 select 正确的 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)
既然你是新手,我已经给出了解决方案并配图
将以下内容视为您的原始图片:
假设以下红色区域是您的感兴趣区域 (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 操作,它专门用于 屏蔽
我正在尝试在图像的特定区域中查找轮廓。是否可以只显示 ROI 内的轮廓而不显示图像其余部分的轮廓?我在另一个类似的 post 中读到我应该使用面具,但我认为我没有正确使用它。我是 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 中设置 ROI,我们使用标准 NumPy 索引 such as in this example。
因此,为了 select 正确的 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)
既然你是新手,我已经给出了解决方案并配图
将以下内容视为您的原始图片:
假设以下红色区域是您的感兴趣区域 (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 操作,它专门用于 屏蔽