OpenCV-Python:“NoneType”类型的对象没有 len()
Posted
技术标签:
【中文标题】OpenCV-Python:“NoneType”类型的对象没有 len()【英文标题】:OpenCV-Python: object of type 'NoneType' has no len() 【发布时间】:2018-08-30 11:27:33 【问题描述】:我有以下 Python 代码在标题中引发错误:
# calculate number of all ROI pixels inside defined(hsv -) color range
pts2 = cv2.findNonZero(mask_final)
non_zero_pixel = int(len(pts2))
这里也一样:
# calculate number of all ROI pixels inside defined(bgr -) color range "black"
pts = cv2.findNonZero(mask_black)
black_pixel = int(len(pts))
我从它的 C++ 版本中翻译了这段代码,它确实可以正常工作:
// Calculate number of all ROI pixels inside defined (hsv-)color range
vector<Point> pts2;
findNonZero(mask_final, pts2);
double non_zero_pixel = static_cast<int>(pts2.size());
我不知道为什么 Python 版本会出现问题,而 C++ 版本不会。
有什么想法吗?
编辑:异常详情:
--------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-119-f76eaba94311> in <module>()
28
29 if __name__ == "__main__":
---> 30 main() # pass the list of arguments from the command line
<ipython-input-119-f76eaba94311> in main()
16
17 # detect screws
---> 18 detectScrews(img)
19
20 for j in range(len(screw_radiuses)):
<ipython-input-118-4c225e9bc794> in detectScrews(img)
80 # calculate number of all ROI pixels inside defined(bgr -) color range "black"
81 pts = cv2.findNonZero(mask_black)
---> 82 black_pixel = int(len(pts))
83
84 # if number of black pixel is lower than threshold
TypeError: object of type 'NoneType' has no len()
【问题讨论】:
你检查过文档,看看是什么情况导致cv2.findNonZero(mask_black)
返回无?
为什么 C++ 版本不这样做?我在同一个图像上运行它。 Python 一个失败,C++ 一个通过。这很奇怪。
因为函数在返回的内容和时间方面可能有不同的行为。同样,文档可能会在这里给出答案。
我试图在我的回答中回答你的问题。
【参考方案1】:
表示mask_final
中没有非零元素。
这显示了同样的错误:
print(len(cv2.findNonZero(np.zeros([3,3], np.uint8))))
为什么 C++ 版本不这样做?我在同一个图像上运行它。 Python 一个失败,C++ 一个通过。很奇怪
Python 返回类型None
,这是典型的 Python 指定没有任何内容的方式。例如,您可以编写(非常 Pythonic):
if cv2.findNonZero(np.zeros([3,3], np.uint8)) is None:
print('I didnt find any zeros')
像C++
这样的语言没有具有相同含义的不同类型。它确实有一个Null
,但它本质上只是一个0
。这意味着如果函数返回一个Null
,它可能会被误认为是索引0
处的元素。 Python 中的None
是它自己的,根本不代表0
。
【讨论】:
我使用条件语句让程序只有在返回值不是 none 的情况下才能继续,并且它有效。谢谢。以上是关于OpenCV-Python:“NoneType”类型的对象没有 len()的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV-Python自适应直方图均衡类CLAHE及方法详解
OpenCV-Python实战(番外篇)——利用 K-Means 聚类进行色彩量化
PyQt5:使用插槽/信号时,self 是 NoneType
AttributeError:“NoneType”对象没有属性“visible_fields”