2012-02-27 7 views
7

저는 파이썬 바인딩을 통해 grab cut 메서드의 OpenCV 구현을 사용하려고했습니다. 나는 cv2와 cv2 모두에서 버전을 사용하려했지만 제대로 실행되도록 메소드를 얻는 데 사용할 올바른 매개 변수를 찾는 데 어려움을 겪고있다. 매개 변수의 여러 순열을 시도했지만 아무 것도 작동하지 않습니다 (기본적으로 Github에서 본 모든 예). 다음은 몇 가지 예는 내가 따라 시도됩니다GrabCut 알고리즘을위한 OpenCV Python 바인딩

Example 1

Example 2

을 그리고 여기에 방법의 설명서 및 알려진 버그 보고서입니다 :

Documentation

Known Grabcut Bug

코드를 실행할 수 있습니다. 아래 예제를 보자. 그러나 빈 (모두 검은 색) 이미지 마스크를 반환한다.

img = Image("pills.png") 
mask = img.getEmpty(1) 
bgModel = cv.CreateMat(1, 13*5, cv.CV_64FC1) 
fgModel = cv.CreateMat(1, 13*5, cv.CV_64FC1) 
for i in range(0, 13*5): 
    cv.SetReal2D(fgModel, 0, i, 0) 
    cv.SetReal2D(bgModel, 0, i, 0) 

rect = (150,70,170,220) 
tmp1 = np.zeros((1, 13 * 5)) 
tmp2 = np.zeros((1, 13 * 5)) 
cv.GrabCut(img.getBitmap(),mask,rect,tmp1,tmp2,5,cv.GC_INIT_WITH_RECT) 

이미지를로드하는 데 SimpleCV를 사용하고 있습니다. 마스크의 종류와 img.getBitmap (의 리턴 타입)입니다

iplimage(nChannels=1 width=730 height=530 widthStep=732) 
iplimage(nChannels=3 width=730 height=530 widthStep=2192) 

사람이 내가 그것을보고 싶어요이 코드의 작업 예제가있는 경우. 가치가있는 것을 위해 나는 OSX Snow Leopard를 사용하고 OpenCV의 내 버전은 SVN 저장소에서 설치되었습니다 (몇 주 전). 참고로 내 입력 이미지는 다음과 같습니다. Input Image

결과 마스크 열거 형 값을 더 눈에 보이는 값으로 변경하려고했습니다. 문제의 반환 값이 아닙니다. 이렇게하면 완전히 검은 색 이미지가 반환됩니다. 나는 몇 가지 더 많은 가치들을 시도 할 것이다.

img = Image("pills.png") 
mask = img.getEmpty(1) 
bgModel = cv.CreateMat(1, 13*5, cv.CV_64FC1) 
fgModel = cv.CreateMat(1, 13*5, cv.CV_64FC1) 
for i in range(0, 13*5): 
    cv.SetReal2D(fgModel, 0, i, 0) 
    cv.SetReal2D(bgModel, 0, i, 0) 

rect = (150,70,170,220) 
tmp1 = np.zeros((1, 13 * 5)) 
tmp2 = np.zeros((1, 13 * 5)) 
cv.GrabCut(img.getBitmap(), mask, rect, tmp1, tmp2, 5, cv.GC_INIT_WITH_MASK) 
mask[mask == cv.GC_BGD] = 0 
mask[mask == cv.GC_PR_BGD] = 0 
mask[mask == cv.GC_FGD] = 255 
mask[mask == cv.GC_PR_FGD] = 255 
result = Image(mask) 
result.show() 
result.save("result.png") 
+0

예를 주 스레드로 옮겼습니다. – kscottz

답변

5

캣은, 코드의이 버전은 나를 위해 작동하는 것 같다.

import numpy as np 
import matplotlib.pyplot as plt 
import cv2 


filename = "pills.png" 
im = cv2.imread(filename) 

h,w = im.shape[:2] 

mask = np.zeros((h,w),dtype='uint8') 
rect = (150,70,170,220) 
tmp1 = np.zeros((1, 13 * 5)) 
tmp2 = np.zeros((1, 13 * 5)) 

cv2.grabCut(im,mask,rect,tmp1,tmp2,10,mode=cv2.GC_INIT_WITH_RECT) 

plt.figure() 
plt.imshow(mask) 
plt.colorbar() 
plt.show() 

레이블 0,2 및 3을 사용하여 그림을 생성합니다. enter image description here

1

마스크는 following values으로 가득 :

  • GC_BGD는 명백한 배경 픽셀을 정의합니다.
  • GC_FGD는 명백한 전경 (대상) 픽셀을 정의합니다.
  • GC_PR_BGD는 가능한 배경 픽셀을 정의합니다.
  • GC_PR_FGD는 가능한 전경 픽셀을 정의합니다.

enum의 일부입니다 어느 :

색상으로 변환
enum { GC_BGD = 0, // background 
     GC_FGD = 1, // foreground 
     GC_PR_BGD = 2, // most probably background 
     GC_PR_FGD = 3 // most probably foreground 
    }; 

: 완전히, 아주 검정, 검정 어두운, 블랙. 나는 당신이 당신의 마스크가 더 좋은 모양 다음 코드를 추가하면 (당신의 example 1에서 가져온 약간 수정) 찾을 수있을 거라 생각 :

mask[mask == cv.GC_BGD] = 0 //certain background is black 
mask[mask == cv.GC_PR_BGD] = 63 //possible background is dark grey 
mask[mask == cv.GC_FGD] = 255 //foreground is white 
mask[mask == cv.GC_PR_FGD] = 192 //possible foreground is light grey 
+1

그래서 나는 이것을 작동 시키려고 할 때 이것을 알아 차렸다. 방금 다음 코드 조각을 실행했습니다. – kscottz

+0

위에서 추가 한 스 니펫을 확인하십시오.이 코드는 작동하지 않습니다. 도와 주셔서 감사합니다. 사용했던 예제 이미지를 포즈를 취할 수 있다면 감사 할 것입니다. – kscottz

+0

Jan Erik의 아래 코멘트에 코드를 입력하면 어떻게됩니까? –