【问题标题】:Using rect and mask simultaneously in OpenCV Grabcut python在 OpenCV Grabcut python 中同时使用 rect 和 mask
【发布时间】:2014-11-20 08:06:35
【问题描述】:

我在 Windows 上的 Python 中使用 OpenCV 3 alpha。我有一种背景减法方法,可以使用抓取工具进行图像分割。所以我有 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 吗?指定一个矩形实际上会使其更快还是我应该裁剪图像?

【问题讨论】:

  • 鉴于您对边界框有一个粗略的了解,为什么不将整个图像裁剪到一个较小的区域并在那里使用grabCut?这肯定会加快算法速度,甚至可能是有利的,因为它不会被远离您想要隔离的对象的背景分散注意力。

标签: python opencv shapely


【解决方案1】:

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

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

它的 C++,但我想你明白了。

更新 1: 我不认为这会更快,但是当您使用 MOG 信息在 ROI 周围绘制一个更大的矩形时,您可以将矩形的外部设置为 GC_BGD。这应该更快。

【讨论】:

  • 我将其作为一种解决方案,因为它确实有效,但仅供读者参考,它仍然不能大大加快抓取速度。不过我很高兴它有效。
【解决方案2】:

我可以看到这是一个老问题,但我现在正在研究它几天,似乎矩形定义中有一个错误。我将我的参数定义为 (x,y,h,w),它对我来说效果很好。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2015-03-19
    • 1970-01-01
    • 2016-10-29
    • 2014-08-31
    • 1970-01-01
    • 2012-03-17
    • 2017-07-17
    • 2015-11-21
    • 1970-01-01
    相关资源
    最近更新 更多