【发布时间】:2017-11-27 18:38:05
【问题描述】:
这里是一个示例代码,展示了 cv2.floodfill 函数的用法
import cv2
import numpy as np
import os
def imshow(img):
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
img = cv2.imread('test4.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
thresh = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY_INV,3,1)
_, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_CCOMP,cv2.CHAIN_APPROX_NONE)
mask = np.zeros(img.shape[:-1],np.uint8)
cv2.drawContours(mask,contours,-1,(255,255,255),-1)
height, width = img.shape[:-1]
mask1 = np.zeros((height+2, width+2), np.uint8) # line 26
cv2.floodFill(mask,mask1,(0,0),255) # line 27
mask_inv=cv2.bitwise_not(mask)
imshow(mask_inv)
我在我的一个项目中使用此功能,但我不理解代码的 mask1 部分(第 26 行和第 27 行) 也就是说,
为什么我们要为高度为“h”和宽度为“w”的给定图像创建形状为 h+2、w+2 的 mask1?(第 26 行)
为什么我们必须将此 mask1 传递给 cv2.floodfill 函数?(第 27 行)
这里是示例代码的输入输出。
请帮忙
【问题讨论】:
-
可能是因为overload that doesn't take a maskisn't exposed to Python. (它需要在前面有一个
CV_EXPORTS_W而不仅仅是CV_EXPORTS) -
请注意,如果您不使用该参数,则可以将
None用于mask1。 -
@AlexanderReynolds 我想这可以解释为什么没有包装其他重载。
-
@DanMašek 我怀疑您需要包含形状为
(h+2, w+2)的掩码的原因只是为了使底层函数不需要在每次调用函数时都创建新的填充掩码(对于边界像素)。对于重复调用,floodFill()是这样做的,最好在调用之前只创建一次填充掩码。
标签: python opencv computer-vision