Windows에서 Python으로 OpenCV 3 alpha를 사용하고 있습니다. grabcut을 사용하여 이미지 분할로 이어지는 배경 빼기 방법이 있습니다. 그래서 전 포그 라운드와 배경에 대한 정보를 제공하는 MOG 검출기가 있습니다. 예를 들어 여기에는 현재 이미지가 있습니다 (시각화를 위해 주어진 사각형). 여기 OpenCV에서 rect와 mask를 동시에 사용 Grabcut python
그리고
MOG은 검출기로부터 출력된다.나는 cv2.grabcut에이 정보를 공급합니다. 내 희망은 내가 전체 이미지를 분할 할 필요가 없으며 알려진 객체 주위의 영역을 지정하고 가능성있는 전경과 배경을 전달하는 것이 더 빠를 것입니다 (?). 블롭이 항상 나에게 검은 이미지를 제공, 그 범위이 xMin, Ymin를, XMAX 있습니다 매끈한 폴리곤으로 Ymax와
#expand the bounding box of the polygons about 5 times
b=blob.buffer(50).bounds
#change to integer
rect=[int(x) for x in b]
#Shapely give coordinates in xmin,ymin,xmax,ymax
#Format into x,y,w,h required by grabcut in opencv
rectf=tuple([rect[0],rect[1],rect[2]-rect[0],rect[3]-rect[1]])
#create a mask
mask = np.zeros(grabCUTimage.shape[:2],np.uint8)
#Make anywhere black in the grey_image (output from MOG) as likely background
#Make anywhere white in the grey_image (output from MOG) as definite foreground
mask[grey_image == 0] = 2
mask[grey_image == 255] = 1
#Make containers
bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,65),np.float64)
#Run grabcut
cv2.grabCut(grabCUTimage,mask,rectf,bgdModel,fgdModel,4,cv2.GC_INIT_WITH_RECT)
#Multiple new mask by original image to get cut
mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')
cGB =grabCUTimage*mask2[:,:,np.newaxis]
저장됩니다. 모든 배경.
cv2.GC_INIT_WITH_MASK로 초기화하면 올바르게 작동합니다 (빨간색 사각형은 무시하십시오). 그러나 때때로 rect를 무시합니다. 왜냐하면 때로는 직사각형 바깥 쪽의 추정 된 전경을 포함하기 때문입니다 (이 경우에는 표시되지 않음).
오전 내가 잘못 RECT를 저장? x, y, w, h가 아닌가요? rect를 지정하면 실제로 더 빨리 만들지, 아니면 이미지를 잘라야합니까?
경계 상자에 대한 대략적인 생각을 감안할 때 전체 이미지를 작은 영역으로 자르고 거기에서 grabCut을 사용하는 것이 어떻습니까? 이것은 반드시 알고리즘의 속도를 높여야하며, 격리하려는 객체로부터 멀리 떨어진 배경에 산만하지 않기 때문에 이점이 있습니다. –