python - 将 floodfill open cv 从 C++ 转换为 Python

标签 python c++ opencv

我正在将 opencv 代码从 C++ 转换为 Python,但卡在了 floodfill 附近的某个地方。

C++ 实现是

Mat floodFilled = cv::Mat::zeros(dilateGrad.rows+2, dilateGrad.cols+2, CV_8U);
floodFill(dilateGrad, floodFilled, cv::Point(0, 0), 0, 0, cv::Scalar(), cv::Scalar(), 4 + (255 << 8) + cv::FLOODFILL_MASK_ONLY);
floodFilled = cv::Scalar::all(255) - floodFilled;
Mat temp;
floodFilled(Rect(1, 1, dilateGrad.cols-2, dilateGrad.rows-2)).copyTo(temp);

我的python实现

h, w = dilateGrad.shape[:2]
floodFilled =np.zeros((h+2,w+2),dtype = np.uint8)
cv2.floodFill(dilateGrad,floodFilled,(0,0),255,cv2.FLOODFILL_MASK_ONLY)
floodFilled =  np.all(255) - floodFilled
floodFilled = cv2.rectangle(dilateGrad,1,1,(h-2,w-2),floodFilled,cv2.CV_8U)

我是 python 中 opencv 的新手,感谢任何人的帮助。

最佳答案

最后一行 C++ 代码中的 Rect 运算符用于指定 floodFilled Mat 的 ROI,并将该 ROI 复制到 Mat temp .

在 python 代码中可以实现类似的行为,如下所示:

temp = floodFilled[1:h-2, 1:w-2].copy()

至于Scalar 运算符,您必须使用python 的元组代替Scalar。像 Scalar::all(255) 将等于 tuple([255] * NumberOfChannels)。对于您当前的情况,NumberOfChannels 是 1,因此它只相当于 255

代替空的 Scalar(),只需传递 None 作为参数。

您的最终代码可能如下所示:

h, w = dilateGrad.shape[:2]
floodFilled = np.zeros((h+2,w+2), dtype = np.uint8)
cv2.floodFill(dilateGrad, floodFilled, (0,0), 255, None, None, cv2.FLOODFILL_MASK_ONLY)
floodFilled =  (255) - floodFilled
temp = floodFilled[1:h-2, 1:w-2].copy()

仅供引用:

cv2.rectangle 函数的作用是在图像上绘制一个矩形。

np.all 评估作为参数传递给它的二进制条件列表,并且仅当列表中的所有 条件评估为 True 时才返回 True。

关于python - 将 floodfill open cv 从 C++ 转换为 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46641698/

相关文章:

python - 当掩码为一个时,numpy 更改数组值

python - 如何向 Django 中的组中的用户发送邮件?

python - 分水岭算法检测的物体面积

java - 将灰度图像转换为 RGB

python - 为什么高斯滤波器在 cv2 和 skimage 之间不同?

python - 将 .xlsx 文件加载到 MySQL 数据库的最快方法

python - QTableWidget 无法获取用户输入的数据

c++:根据预定义的元素索引选择 std::vector 的子集

c++ - 使用离散输入变量的自然域中的多对一映射?

c++ - 访问另一个类成员