从 C++ 到 Python 的 OpenCV absdiff 等价物

OpenCV absdiff equivalent from c++ to Python

这是来自 C++ 的示例:

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

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

我在 Python 中尝试了以下方法:

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

这失败了:

Error: Assertion failed (type2 == 6 && (sz2.height == 1 || sz2.height == 4)) in arithm_op, file /tmp/opencv-20180529-55469-97fkx6/opencv-3.4.1/modules/core/src/arithm.cpp, line 661

如何正确翻译这段代码?

仔细查看错误信息。您不仅需要 NumPy 数组的类型为 CV_64F 或浮点数,高度还需要为 1 或 4。对于您的特定情况,这意味着您必须提供一个具有高度的 2D NumPy 数组of 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 数组构造函数中只提供一个二维列表而不是一维列表来获得相同的结果。这取决于您如何创建标量:

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