这是C ++的示例:
cv::absdiff(input,cv::Scalar(target),output);
其中target
是cv::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行
如何正确翻译此代码?
答案 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))