在 Python 下使用 opencv 库时,会发生报错 TypeError: 'numpy._DTypeMeta' object is not subscriptable。
1 问题描述
在 python 中使用 opencv 库;
ubuntu版本:22.04 python版本:3.10.12 opencv-python版本:4.8.0.76 numpy版本:1.21.5
a@ubuntu2204:~$ python3
Python 3.10.12 (main, Jun 11 2023, 05:26:28) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
Traceback (most recent call last):
File "
File "/usr/local/lib/python3.10/dist-packages/cv2/__init__.py", line 181, in
bootstrap()
File "/usr/local/lib/python3.10/dist-packages/cv2/__init__.py", line 175, in bootstrap
if __load_extra_py_code_for_module("cv2", submodule, DEBUG):
File "/usr/local/lib/python3.10/dist-packages/cv2/__init__.py", line 28, in __load_extra_py_code_for_module
py_module = importlib.import_module(module_name)
File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "/usr/local/lib/python3.10/dist-packages/cv2/typing/__init__.py", line 69, in
NumPyArrayGeneric = numpy.ndarray[typing.Any, numpy.dtype[numpy.generic]]
TypeError: 'numpy._DTypeMeta' object is not subscriptable
>>>
2 解决方法
找到上述问题中的最后一个报错文件,也就是 "/usr/local/lib/python3.10/dist-packages/cv2/typing/__init__.py" ,找到第 69 行,将 68 至 83 行与 numpy 相关的部分使用单引号作为参数;
修改前:
if numpy.lib.NumpyVersion(numpy.__version__) > "1.20.0" and sys.version_info >= (3, 9):
NumPyArrayGeneric = numpy.ndarray[typing.Any, numpy.dtype[numpy.generic]]
else:
NumPyArrayGeneric = numpy.ndarray
if numpy.lib.NumpyVersion(numpy.__version__) > "1.20.0" and sys.version_info >= (3, 9):
NumPyArrayFloat32 = numpy.ndarray[typing.Any, numpy.dtype[numpy.float32]]
else:
NumPyArrayFloat32 = numpy.ndarray
if numpy.lib.NumpyVersion(numpy.__version__) > "1.20.0" and sys.version_info >= (3, 9):
NumPyArrayFloat64 = numpy.ndarray[typing.Any, numpy.dtype[numpy.float64]]
else:
NumPyArrayFloat64 = numpy.ndarray
修改后:
if numpy.lib.NumpyVersion(numpy.__version__) > "1.20.0" and sys.version_info >= (3, 9):
NumPyArrayGeneric = 'numpy.ndarray[typing.Any, numpy.dtype[numpy.generic]]'
else:
NumPyArrayGeneric = 'numpy.ndarray'
if numpy.lib.NumpyVersion(numpy.__version__) > "1.20.0" and sys.version_info >= (3, 9):
NumPyArrayFloat32 = 'numpy.ndarray[typing.Any, numpy.dtype[numpy.float32]]'
else:
NumPyArrayFloat32 = 'numpy.ndarray'
if numpy.lib.NumpyVersion(numpy.__version__) > "1.20.0" and sys.version_info >= (3, 9):
NumPyArrayFloat64 = 'numpy.ndarray[typing.Any, numpy.dtype[numpy.float64]]'
else:
NumPyArrayFloat64 = 'numpy.ndarray'
保存文件,然后在 python 中引用 cv2 就不会再报错:
a@ubuntu2204:~$ python3
Python 3.10.12 (main, Jun 11 2023, 05:26:28) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>>
3 其他方法
网络上有比较多的类似报错,一部分是将 numpy 的版本降低,但是笔者尝试后无效,最终使用上述方法解决问题。
参考链接: https://github.com/opencv/opencv-python/issues/885 https://stackoverflow.com/questions/68916893/typeerror-numpy-dtypemeta-object-is-not-subscriptable
参考文章
发表评论