Мне нужна маска, чтобы круг на этом изображении выделялся на заднем плане, получая двоичное изображение, где белый - это область интереса (круг), а черный - все остальное. Так что я могу применить эту маску в видео захвате, где можно увидеть только сферу. примечание: фон, как правило, будет белым.
Я уже создал коды, используя порог или 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()