2012-02-27 16 views
7

私は、grab cutメソッドのOpenCV実装をPythonバインディングを介して使用しようとしています。私はcvとcv2の両方でバージョンを使用しようとしましたが、正しく実行するためのメソッドを取得するために使用する正しいパラメータを見つけることができません。私はパラメータのいくつかの順列を試してみましたが、何も動作していないようです(基本的にGithubで見たすべての例)。ここで私は従うことをしようとしたカップルの例です:OpenCV Pythonバインディングfor GrabCutアルゴリズム

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 { GC_BGD = 0, // background 
         GC_FGD = 1, // foreground 
         GC_PR_BGD = 2, // most probably background 
         GC_PR_FGD = 3 // most probably foreground 
        }; 
    

    色に変換どの:完全に、非常にブラック、ブラック暗い、ブラック全てenumの一部である

。私はあなたのマスクがより見やすくなりますが、次のコードを追加した場合(あなた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のコメントでコードを試してみたらどうなりますか? –

関連する問題