我一直在尝试通过Python绑定使用抓取方法的OpenCV实现。我曾尝试在cv和cv2中使用该版本,但我无法找到正确的参数来使该方法正确运行。我尝试了几个参数的排列,似乎没有任何工作(基本上我在Github上看到过的每个示例)。这里有几个例子我试图遵循:GrabCut算法的OpenCV Python绑定
这里是方法的文档和已知的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存储库安装的(截至几周前)。作为参考我的输入图像是这样的:
我试着改变结果掩码枚举值更明显的东西。这不是问题的返回值。这会返回一个完全黑色的图像。我会尝试更多的价值观。
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")
将示例移动到主线程。 – kscottz 2012-02-28 17:38:38