从C ++到Python的OpenCV Absdiff等效

时间:2018-06-28 14:28:52

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

这是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行

如何正确翻译此代码?

1 个答案:

答案 0 :(得分:1)

非常仔细地查看错误消息。您不仅需要将NumPy数组的类型设置为CV_64F或浮点数,还需要将高度设置为1或4。对于您的特定情况,这意味着您必须提供一个具有高度的2D NumPy数组的1。默认情况下,您创建的数组的类型为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))