为啥使用 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:
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