我试图在Python 3.5中使用cv2.grabcut
函数-
我使用cv2.GC_INIT_WITH_MASK
作为初始化方法,但结果似乎很奇怪,并且输出掩码不是我期望的。
import cv2
import numpy as np
import matplotlib.pyplot as plt
#
img = np.zeros((200,200, 3), 'uint8')
mask = np.zeros((200,200), 'uint8')
cv2.circle(img, (100,100), 50, (255,255,255), -1);
cv2.circle(mask, (100,100), 5, 1, -1)
#
bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,65),np.float64)
out_mask, out_bgdModel, out_fgdModel = cv2.grabCut(img, mask, None, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_MASK)
#
print('opencv', cv2.version) # opencv 3.1.0
#
fig,ax = plt.subplots(1,3)
ax[0].imshow(img)
ax[1].imshow(mask)
ax2.imshow(out_mask)
plt.show()
尽管蒙版起始于给定圆的中心,但它无法捕获完整形状,但会保留原始蒙版形状。增加迭代次数没有帮助。
p.s我用作示例,我在真实图像上得到类似的结果。
答案 0 :(得分:0)
我需要启动面具作为抓取枚举。 以下修复程序有效。
mask = np.full((200,200),cv2.GC_PR_BGD,np.uint8)
cv2.circle(mask, (100,100), 5, int(cv2.GC_PR_FGD), -1)
out_mask, _, _ = cv2.grabCut(img, mask, None, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_MASK)