OpenCV absdiff 相当于从 c++ 到 Python

OpenCV absdiff equivalent from c++ to Python

本文关键字:Python c++ absdiff 相当于 OpenCV      更新时间:2023-10-16

这是C++的一个示例:

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

target在哪里cv::Vec3b [190, 119, 102]

我在Python中尝试了以下内容:

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

这失败了:

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

如何正确翻译此代码?

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

最后,您可以在标量中引入一个单一实例行,这将有助于您执行此操作:

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的 2D NumPy 数组,而不是一个3,NumPy 数组。

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

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