我一直在尝试通过Python绑定使用抓取方法的OpenCV实现。我已尝试在cv和cv2中使用该版本,但我找不到用于使方法正确运行的正确参数。我已经尝试了几个参数的排列,似乎没有任何工作(基本上我在Github上看到的每个例子)。以下是我试图遵循的几个例子:
这是方法的文档和已知的错误报告:
我可以使用下面的示例获取代码,但它会返回一个空白(全黑)图像蒙版。
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")
答案 0 :(得分:5)
Kat,这个版本的代码似乎对我有用。
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。
答案 1 :(得分:1)
你的面具充满了following values:
这些都属于enum:
enum { GC_BGD = 0, // background
GC_FGD = 1, // foreground
GC_PR_BGD = 2, // most probably background
GC_PR_FGD = 3 // most probably foreground
};
转换为颜色:完全黑色,非常黑色,深黑色和黑色。我想你会发现,如果你添加下面的代码(取自你的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