代码之家  ›  专栏  ›  技术社区  ›  faizan baig

将floodfill open cv从c++转换为python

  •  2
  • faizan baig  · 技术社区  · 7 年前

    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的新手,非常感谢任何人的帮助。

    1 回复  |  直到 7 年前
        1
  •  1
  •   sgarizvi    7 年前

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

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

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

    至于 Scalar 运算符,您必须使用python的元组来代替 标量 . 喜欢 Scalar::all(255) 将等于 tuple([255] * 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 计算作为参数传递给它的二进制条件列表,仅当 全部的