问题描述
我想仅将绘制轮廓区域转换为 RGB 图像,然后再次将其转换为 HSV,以便随着时间的推移更新每帧的上下值。
注意:我想避免使用矩形区域的 ROI,因为 drawcontours 是实际区域。
我尝试根据 drawContours 区域 roi2 = clone1[contour[[0]]]
cv2.imshow("roi2",roi2)
而不是矩形区域 roi1 = clone1[y:y + h,x:x + h]
cv2.imshow("roi1",roi1)
不知道有没有可能。
OR 如何使用原始图像(RGB 图像)的副本为除 drawContours 区域之外的整个图像创建遮罩?类似于roi1 = clone1[...]
完整的代码:
import cv2
import numpy as np
import time
cap = cv2.VideoCapture(0)
width = cap.get(3) # float
height = cap.get(4) # float
time.sleep(2.0)
while (1):
_,img = cap.read()
clone1 = img.copy()
if _ is True:
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
else:
continue
black_lower = np.array([0,0],np.uint8)
black_upper = np.array([180,255,30],np.uint8)
black = cv2.inRange(hsv,black_lower,black_upper)
# Morphological Transform,dilation
kernal = np.ones((5,5),"uint8")
black = cv2.dilate(black,kernal)
res_black = cv2.bitwise_and(img,img,mask=black)
(_,contours,hierarchy) = cv2.findContours(black,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
cv2.imshow("ROI_",_)
cnts = sorted(contours,key=cv2.contourArea,reverse=True)[:1] # get largest contour area
for pic,contour in enumerate(cnts):
area = cv2.contourArea(contour)
if (area > 300):
x,y,w,h = cv2.boundingRect(contour)
# segmented = max(cnts,key=cv2.contourArea)
img = cv2.rectangle(img,(x,y),(x + w,y + h),(0,0),2)
roi1 = clone1[y:y + h,x:x + h]
cv2.imshow("roi1",roi1)
cv2.putText(img,"Black Colour",cv2.FONT_HERShey_SIMPLEX,0.7,0))
bbbbb = cv2.drawContours(img,[contour],-1,3) # segmentation
# roi2 = clone1[contour[[0]]]
# cv2.imshow("roi2",roi2)
cv2.imshow("Color Tracking",img)
if cv2.waitKey(10) & 0xFF == ord('q'):
cap.release()
cv2.destroyAllWindows()
break
解决方法
import cv2
import numpy as np
import time
cap = cv2.VideoCapture(0)
width = cap.get(3) # float
height = cap.get(4) # float
time.sleep(2.0)
while (1):
_,img = cap.read()
clone1 = img.copy()
if _ is True:
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
else:
continue
black_lower = np.array([0,0],np.uint8)
black_upper = np.array([180,255,30],np.uint8)
black = cv2.inRange(hsv,black_lower,black_upper)
# Morphological Transform,Dilation
kernal = np.ones((5,5),"uint8")
black = cv2.dilate(black,kernal)
res_black = cv2.bitwise_and(img,img,mask=black)
(_,contours,hierarchy) = cv2.findContours(black,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
cnts = sorted(contours,key=cv2.contourArea,reverse=True)[:1] # get largest contour area
for pic,contour in enumerate(cnts):
# print type(contour),type(img)
# print contour.dtype,img.dtype
area = cv2.contourArea(contour)
if (area > 300):
x,y,w,h = cv2.boundingRect(contour)
img = cv2.rectangle(img,(x,y),(x + w,y + h),(0,0),2)
roi1 = clone1[y:y + h,x:x + w]
cv2.imshow("roi1",roi1)
cv2.putText(img,"Black Colour",cv2.FONT_HERSHEY_SIMPLEX,0.7,0))
bbbbb = cv2.drawContours(img,[contour],-1,3) # segmentation
# roi2 = clone1[contour[[0]]]
# cv2.imshow("roi2",roi2)
# imaf = np.uint8(contour)
# imaf = cv2.polylines(img,True,5)
# print 'imaf',imaf.dtype,img.dtype
# roi2 = cv2.drawContours(mask,1)
mask = np.zeros(img.shape,np.uint8)
# roi_corners = np.array([[(2,2),(150,50),(100,100),(2,100)]],dtype=np.int32)
# roi_corners = np.array([[(x,y + h)]],dtype=np.int32)
roi_corners = np.array([contour],dtype=np.int32)
channel_count = img.shape[2] # i.e. 3 or 4 depending on your image
ignore_mask_color = (255,) * channel_count
cv2.fillPoly(mask,roi_corners,ignore_mask_color)
# cv2.fillConvexPoly(mask,ignore_mask_color)
masked_image = cv2.bitwise_and(img,mask)
hsvRoi1 = cv2.cvtColor(masked_image,cv2.COLOR_BGR2HSV)
black_lower = np.array(
[hsvRoi1[:,:,hsvRoi1[:,1],2]])
black_upper = np.array(
[hsvRoi1[:,2]])
h_values = np.array([hsvRoi1[:,0]])
h_min = h_values[(h_values >= 1)].min()
h_max = h_values[(h_values <= 178)].max()
s_values = np.array([hsvRoi1[:,1]])
s_min = s_values[(s_values >= 1)].min()
s_max = s_values[(s_values <= 254)].max()
v_values = np.array([hsvRoi1[:,2]])
v_min = v_values[(v_values >= 1)].min()
v_max = v_values[(v_values <= 254)].max()
black_lower = np.array([h_min,s_min,v_min],np.uint8)
black_upper = np.array([h_max,s_max,v_max],np.uint8)
print 'black_lower,black_upper',black_upper
cv2.imshow("roihsv",masked_image)
cv2.imshow("Color Tracking",img)
if cv2.waitKey(10) & 0xFF == ord('q'):
cap.release()
cv2.destroyAllWindows()
break