Windows上のPythonでOpenCV 3アルファを使用しています。グラブカットを使用した画像セグメンテーションにつながるバックグラウンド減算法があります。そのため、前景と背景の可能性のある情報を提供するMOG検出器があります。たとえば、ここに現在の画像があります(視覚化のために与えられた四角形)。
そして、これが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を間違って保存していますか? x,y,w,h じゃないの?rect を指定すると実際に高速になりますか、それとも画像をトリミングする必要がありますか?