2014-09-25 5 views
2

Windows에서 Python으로 OpenCV 3 alpha를 사용하고 있습니다. grabcut을 사용하여 이미지 분할로 이어지는 배경 빼기 방법이 있습니다. 그래서 전 포그 라운드와 배경에 대한 정보를 제공하는 MOG 검출기가 있습니다. 예를 들어 여기에는 현재 이미지가 있습니다 (시각화를 위해 주어진 사각형). 여기 OpenCV에서 rect와 mask를 동시에 사용 Grabcut python

Input image

그리고

MOG은 검출기로부터 출력된다.

enter image description here

나는 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를 무시합니다. 왜냐하면 때로는 직사각형 바깥 쪽의 추정 된 전경을 포함하기 때문입니다 (이 경우에는 표시되지 않음).

enter image description here

오전 내가 잘못 RECT를 저장? x, y, w, h가 아닌가요? rect를 지정하면 실제로 더 빨리 만들지, 아니면 이미지를 잘라야합니까?

+0

경계 상자에 대한 대략적인 생각을 감안할 때 전체 이미지를 작은 영역으로 자르고 거기에서 grabCut을 사용하는 것이 어떻습니까? 이것은 반드시 알고리즘의 속도를 높여야하며, 격리하려는 객체로부터 멀리 떨어진 배경에 산만하지 않기 때문에 이점이 있습니다. –

답변

0

는 내가 제대로 이해 있는지 확실하지 않습니다,하지만 당신은 Grabcut에서 "GC_Init_with_Rect"를 사용할 때의 더 나은 전체 마스크를 초기화하고이 "아마 배경 화면"을 설정할 수 :

mask = Mat::ones(image.size(), CV_8UC1) * GC_PR_BGD; //GC_PR_BGD 

의 C++하지만, 나는 당신이 생각을 가지고 있다고 생각합니다.

업데이트 1 : 나는 이것이 더 빠르다고 생각하지 않지만 MOG 정보를 사용하여 ROI 주위에 더 큰 직사각형을 그리면 직사각형 바깥 쪽을 GC_BGD로 설정할 수 있습니다. 이것은 더 빨라야합니다.

+0

작동하지 않기 때문에 해결책으로 만 만들고 있지만 독자 정보로는 그래브 컷의 속도를 크게 높이지는 못합니다. 그래도 다행입니다. – bw4sz

0

나는 이것이 오래된 질문이라는 것을 알 수 있었지만 지금은 며칠 동안 작업을하고 있었으며 사각형 정의에 실수가있는 것으로 보인다. 내 매개 변수를 (x, y, h, w)로 정의하고 나에게 아름답게 작용했습니다.

희망이 있습니다.