为啥使用 cv2.calcHist 总是有一个错误“返回 NULL 而没有设置错误”

Posted

技术标签:

【中文标题】为啥使用 cv2.calcHist 总是有一个错误“返回 NULL 而没有设置错误”【英文标题】:why using cv2.calcHist always has an errer "returned NULL without setting an error"为什么使用 cv2.calcHist 总是有一个错误“返回 NULL 而没有设置错误” 【发布时间】:2019-03-20 02:59:45 【问题描述】:

我在 python 中使用 Opencv,遇到了一个问题。 当我运行以下代码时:

img = cv2.imread('test.jpg',0)
hist = cv2.calcHist([img],[0],None,256,[0,256])

发生错误:SystemError: 返回NULL但未设置错误 我很困惑,在网络中找不到相同的错误,所以出了什么问题? 谢谢。

PS:我在windows和ubuntu下运行同样的代码,报同样的错误,可能不是系统原因?

【问题讨论】:

作为 NULL 的一般建议,请始终检查您的图像是否为空。 【参考方案1】:

错误消息确实令人困惑,但实际错误很简单。即使您只使用 1 个通道,您仍然需要提供直方图大小和范围的列表。您已经为范围做到了这一点,但没有为尺寸做到这一点。 这应该有效:

img = cv2.imread('test.jpg',0)
hist = cv2.calcHist([img],[0],None,[256],[0,256])

Wo-Ki 预测您的下一个问题,因为只制作蓝色通道的直方图是不寻常的,您可能需要强度直方图。在这种情况下,请按照 Wo-Ki 的建议使用中间转换步骤。

【讨论】:

您的诊断和解决方案对我来说也是很好的。 “只制作蓝色通道的直方图是不寻常的”,可以,但不一定,例如通常将 3 个通道的直方图分别计算到 adjust the white balance。【参考方案2】:

这个问题可以这样解决:

img = cv2.imread("picture.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
hist = cv2.calcHist([gray], [0], None, [256], [0, 256]) 

【讨论】:

【参考方案3】:

我遇到了同样的问题。显然范围 [0, 256] 必须与 img 的类型相同。 试试

hist = cv2.calcHist([img.astype('uint8')],[0],None,[256],[0, 256]) 

相反。它应该可以正常工作。

【讨论】:

以上是关于为啥使用 cv2.calcHist 总是有一个错误“返回 NULL 而没有设置错误”的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenCV 官方 Matlab 绑定 cv.calcHist

图像美画

为啥 InstanceID 总是返回一个令牌,尽管有错误的 senderId?

为啥总是在我的代码中显示语法错误?

为啥输入验证码总是错误啊

为啥基本身份验证总是使用 restTemplate 给出错误 403?