Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在OpenCV Grabcut python中同时使用rect和mask_Python_Opencv_Shapely - Fatal编程技术网

在OpenCV Grabcut python中同时使用rect和mask

在OpenCV Grabcut python中同时使用rect和mask,python,opencv,shapely,Python,Opencv,Shapely,我在Windows上的Python中使用OpenCV 3 alpha。我有一种背景减法,可以使用grabcut进行图像分割。所以我有一个MOG探测器,它能给我一些关于可能的前景和背景的信息。例如,这里是当前图像(rect只是为了可视化而给出的) 这是MOG探测器的输出 我想把这些信息输入到cv2.grabcut中。我的希望是,我不需要分割整个图像,而且在已知对象周围指定一个区域并传递可能的前景和背景会更快(?)。水滴存储为形状多边形,其边界为xmin、ymin、xmax、ymax 这总是给

我在Windows上的Python中使用OpenCV 3 alpha。我有一种背景减法,可以使用grabcut进行图像分割。所以我有一个MOG探测器,它能给我一些关于可能的前景和背景的信息。例如,这里是当前图像(rect只是为了可视化而给出的)

这是MOG探测器的输出

我想把这些信息输入到cv2.grabcut中。我的希望是,我不需要分割整个图像,而且在已知对象周围指定一个区域并传递可能的前景和背景会更快(?)。水滴存储为形状多边形,其边界为xmin、ymin、xmax、ymax

这总是给我一个黑色的印象。所有背景

当我使用cv2.GC_INIT_和_MASK初始化时,它工作正常(请忽略红色方块)。但是,它肯定会忽略rect,因为有时它包括rect边界之外的估计前景(本例中未显示)


我是否存储了rect错误?这不是x,y,w,h吗?指定一个rect会使它更快吗?或者我应该裁剪图像吗?

我不确定我是否理解正确,但当您在Grabcut中使用“GC_Init_with_rect”时,最好初始化整个遮罩并将其设置为“可能背景”:

它的C++,但我想你明白了。 更新1:
我不认为这更快,但是当你使用你的MOG信息在你的ROI周围画一个更大的矩形时,你可以将矩形的外侧设置为GC_BGD。这应该更快。

我可以看出这是一个老问题,但我已经研究了几天了,似乎矩形的定义有错误。我将我的参数定义为(x,y,hw),它对我来说非常有效


希望能有所帮助。

我将此作为一个解决方案,因为它确实有效,但仅为读者提供信息,它仍然不能大大加快grabcut的速度。不过我很高兴它能工作。既然你对边界框有一个大致的概念,为什么不把整个图像裁剪成一个较小的区域,然后在那里使用grabCut呢?这肯定会加快算法的速度,甚至可能是有利的,因为它不会被远离您想要隔离的对象的背景分散注意力。
#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]
mask = Mat::ones(image.size(), CV_8UC1) * GC_PR_BGD; //GC_PR_BGD