在 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 "", line 1, in

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

参考文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: