我使用python3.5和OpenCV 3.1.0,OpenCV函数cv2.countNonZero(img)我得到了一

I use python3.5 and OpenCV 3.1.0,OpenCV function cv2.countNonZero(img) I got a error

本文关键字:OpenCV img countNonZero cv2 python3 函数      更新时间:2023-10-16

我得到以下代码的错误:

img = cv2.imread('temp.jpg')
z = cv2.countNonZero(img)
print(z)
OpenCV Error: Assertion failed (cn == 1) in cv::countNonZero, file D:BuildOpenCVopencv-3.1.0modulescoresrcstat.cpp, line 1342
Traceback (most recent call last):
  File "C:UsershaseeDesktopopenGuiFeaturesinOpenCVPerformance Measurement and Improvement TechniquesTestTickCount.py", line 29, in <module>
    z = cv2.countNonZero(img)
cv2.error: D:BuildOpenCVopencv-3.1.0modulescoresrcstat.cpp:1342: error: (215) cn == 1 in function cv::countNonZero

但是,如果我使用numpy函数它是可以的:

z = np.count_nonzero(img)
print(z)

我不明白为什么。

相同的问题,但是这里c++:

countNonZero函数给出openCV

断言错误

解决方案:

countNonZero的OpenCV文档说:

cv2.countNonZero(src)→检索

参数:src -单通道数组。

让我们看一下imread文档:

imread (const String&filename, int flags=IMREAD_COLOR)

参数:src flags -

=0返回灰度图像。

<0按原样返回加载的图像(带有alpha通道)。>

如果你加载带有默认标志IMREAD_COLOR的图像,OpenCV将动态检测图像(和返回的垫)是3通道灰度还是1通道灰度。

要解决这个问题,让OpenCV自动将加载的图像转换为灰度:

img = cv2.imread('temp.jpg',cv2.CV_LOAD_IMAGE_GRAYSCALE)
z = cv2.countNonZero(img)
print(z)

您也可以在加载cv2.cvtColor后转换您的图像。

你的numpy代码工作得很好,因为np.count_nonzero接受array_like作为输入,这可能是很多疯狂的东西

当我加载彩色图像时,我可能会重现类似的错误。

opencv中的

countNonZero请求输入图像为单通道。当它是彩色图像(即3通道)时,它给出错误。