【发布时间】:2020-04-08 13:38:03
【问题描述】:
我需要一个蒙版来使这个image 中的圆圈从背景中脱颖而出,接收二值图像,其中白色是感兴趣的区域(圆圈),而黑色是其他所有区域。所以我可以在视频捕捉中应用这个蒙版,在那里只能看到球体。 注意:背景通常是白色的。
我已经使用阈值或 inRange 创建了代码,使用简单的算法,从用户手动进行的选择中,标记圆的区域,它会删除最小和最大 rgb 值,从而创建一个要应用的参数在 inRange 或阈值内。然而,由于背景通常是白色和清晰的,与球体的颜色非常相似,二进制掩码包括背景,使得代码失败。 还有其他方法吗?
import cv2
import numpy as np
ix,iy = 0,0
def selection_area(event,x,y,flags,param):
global ix,iy
global vx,vy
if event == cv2.EVENT_LBUTTONDBLCLK:
cv2.rectangle(img,(x-5,y-5),(x+5,y+5),(255,255,0),-1)
if ix!=0 and iy!=0:
cv2.rectangle(img,(x,y),(ix,iy),(255,0,0),1)
vx=[x,ix]
vy=[y,iy]
ix,iy = x,y
def analyzeRGB(cimg):
b=[];g=[];r=[];
for j in cimg:
for i in j:
b.append(i[0])
g.append(i[1])
r.append(i[2])
lower_blue= np.array([min(b),min(g),min(r)])
upper_blue= np.array([max(b),max(g),max(r)])
return lower_blue,upper_blue
cap = cv2.VideoCapture(0)
while(True):
ret, frame = cap.read()
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
img=frame
break
cap.release()
cv2.destroyAllWindows()
cv2.imshow('Analyze',img)
cv2.setMouseCallback('Analyze',selection_area)
while(1):
cv2.imshow('Analyze',img)
k = cv2.waitKey(20) & 0xFF
if k == ord('q'):
print (vx,vy)
break
cv2.destroyAllWindows()
cut = img[min(vy)+5:max(vy)-5,min(vx)+5:max(vx)-5]
cv2.imshow("Cut",cut)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(0)
filter_RGB =analyzeRGB(cut)
img = cv2.inRange(img, filter_RGB[0],filter_RGB[1])
cv2.imshow("Ready",img)
cv2.imshow("Cut",cut)
cv2.waitKey(0)
cv2.destroyAllWindows()
cap = cv2.VideoCapture(0)
while(True):
ret, frame = cap.read()
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY);
frame =cv2.inRange(frame,filter_RGB[0],filter_RGB[1])
cv2.imshow("Frame",frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
【问题讨论】:
标签: python-3.x opencv