【问题标题】:Converting c++ copyTo to python将 c++ copyTo 转换为 python
【发布时间】:2017-07-16 01:48:04
【问题描述】:

我正在尝试将以下 OpenCV C++ 转换为 Python:

Cpp:

//step1
Mat edges;
adaptiveThreshold(vertical, edges, 255, CV_ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 3, -2);
imshow("edges", edges);
// Step 2
Mat kernel = Mat::ones(2, 2, CV_8UC1);
dilate(edges, edges, kernel);
imshow("dilate", edges);
// Step 3
Mat smooth;
vertical.copyTo(smooth);
// Step 4
blur(smooth, smooth, Size(2, 2));
// Step 5
smooth.copyTo(vertical, edges);
// Show final result
imshow("smooth", vertical);

我不确定如何处理将 step3 转换为 python。我已经在 python 中完成了第 1 步和第 2 步

#step1
edges = cv2.adaptiveThreshold(vertical,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,3,-2)

#step2 
kernel = np.ones((2, 2), dtype = "uint8")
dilated = cv2.dilate(edges, kernel)

【问题讨论】:

    标签: python c++ image opencv image-processing


    【解决方案1】:

    cv::Mat::copyTo 在您的情况下只是复制图像。实际上,您使用它的方式等同于使用cv::Mat::clone,因为您没有指定掩码。因此在 Python 中,使用 numpy.copy 方法,因为 OpenCV 使用 NumPy 数组作为主要数据类型:

    # Step #3
    smooth = vertical.copy()
    

    对于第 5 步,您现在基于掩码进行复制。我已经在我之前的帖子中回答了如何做到这一点:Equivalent of copyTo in Python OpenCV bindings?。您正在查看您要复制到的矩阵已经分配并且只想复制掩码中非零值的第二种情况。但是,为了完整起见,我将其放在这里。

    您实际上想使用smooth 修改vertical,但只复制smooth 中由edges 中的非零元素定义的元素。您可以使用numpy.where 查找非零行和列位置,并使用它们复制smoothvertical 之间的正确值。看起来你也有一个灰度图像,所以这使它更简单:

    # Step #5
    (rows, cols) = np.where(edges != 0)
    vertical[rows, cols] = smooth[rows, cols]
    

    【讨论】:

    • 谢谢!现在这是有道理的。此外,您对第 5 步的解释非常有帮助。在更大的上下文中,我正在尝试将 c++ 代码转换为 python。我已经做到了,但我怀疑这是不正确的,因为结果不一样。我已经发布了一个单独的问题,非常感谢您在 stackoverflow.com/questions/42453892/… 上的意见
    • 不客气。我现在确实要睡觉了,但我醒来时会检查你的问题。
    猜你喜欢
    • 2019-06-20
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    相关资源
    最近更新 更多