【问题标题】:I use python3.5 and OpenCV 3.1.0,OpenCV function cv2.countNonZero(img) I got a error [duplicate]我使用 python3.5 和 OpenCV 3.1.0,OpenCV 函数 cv2.countNonZero(img) 我得到一个错误 [重复]
【发布时间】:2016-11-15 15:05:40
【问题描述】:

我收到以下代码错误:

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

OpenCV Error: Assertion failed (cn == 1) in cv::countNonZero, file D:\Build\OpenCV\opencv-3.1.0\modules\core\src\stat.cpp, line 1342
Traceback (most recent call last):
  File "C:\Users\hasee\Desktop\open\GuiFeaturesinOpenCV\Performance Measurement and Improvement Techniques\TestTickCount.py", line 29, in <module>
    z = cv2.countNonZero(img)
cv2.error: D:\Build\OpenCV\opencv-3.1.0\modules\core\src\stat.cpp:1342: error: (215) cn == 1 in function cv::countNonZero

但是,如果我使用 numpy 函数就可以了:

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

我不明白为什么。

【问题讨论】:

标签: python c++ opencv numpy


【解决方案1】:

同样的问题,但这里是 C++:

countNonZero function gives an assertion error in openCV

解决方案:

countNonZero 的 OpenCV 文档说:

cv2.countNonZero(src) → retval

参数:src——单通道数组。

让我们看看imread 文档:

imread(const String& 文件名, int flags=IMREAD_COLOR )

参数:src flags -

=0 返回灰度图像。

如果您使用默认标志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_nonzeroarray_like 作为输入,这可能是很多疯狂的东西。

【讨论】:

  • 感谢您的回答:)
  • @TengFei 不客气。如果对我的回答有帮助,您可以投票赞成。
  • 是的,您的回答很有帮助。我想投票,但这个页面提示我:感谢您的反馈!声望低于 15 人的投票会被记录,但不会更改公开显示的帖子得分。
【解决方案2】:

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

opencv 中的countNonZero 请求输入图像为单通道。当它是彩色图像(即具有 3 个通道)时,它会给出错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    相关资源
    最近更新 更多