【问题标题】:OpenCV absdiff equivalent from c++ to Python从 c++ 到 Python 的 OpenCV absdiff 等价物
【发布时间】:2018-12-07 16:28:46
【问题描述】:

这是一个来自 C++ 的示例:

cv::absdiff(input,cv::Scalar(target),output);

其中targetcv::Vec3b [190, 119, 102]

我在 Python 中尝试了以下操作:

output = cv2.absdiff(image,  np.array([190, 119, 102]) )

这失败了:

错误:断言失败(type2 == 6 && (sz2.height == 1 || sz2.height == 4)) 在 arithm_op,文件 /tmp/opencv-20180529-55469-97fkx6/opencv-3.4.1/modules/core/src/arithm.cpp, 第 661 行

如何正确翻译这段代码?

【问题讨论】:

    标签: python c++ numpy opencv opencv3.0


    【解决方案1】:

    仔细查看错误消息。您不仅需要 NumPy 数组的类型为 CV_64F 或浮点数,高度还需要为 1 或 4。对于您的具体情况,这意味着您必须提供高度为 1 的 2D NumPy 数组. 默认情况下,您创建的数组类型为int32,因此请确保将dtype 指定为np.float

    最后,你可以在你的标量中引入一个单例行来帮助你做到这一点:

    output = cv2.absdiff(image, np.array([190, 119, 102], dtype=np.float)[None])
    

    这段代码np.array([190, 119, 102], dtype=np.float)[None] 创建了一个普通的 NumPy 数组,但确保精度是浮点数,我们引入了一个单一维度,因此它变成了一个 1 x 3 二维 NumPy 数组,而不是 3, NumPy 数组。

    最后一个想法是,您也可以在 NumPy 数组构造函数中只提供一个 2D 列表而不是 1D 列表来实现相同的结果。这取决于您如何创建标量:

    output = cv2.absdiff(image, np.array([[190, 119, 102]], dtype=np.float))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-25
      • 1970-01-01
      • 2022-12-08
      • 2011-10-29
      • 2015-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多