背景说明

        今天在开发测试一个视频目标检测项目的时候偶尔发现PyCharm给了自己很多警告提示,如下,仔细一看大部分都是来自于OpenCV的警告,提示找不到函数啥的,自己的环境中明明是装了这些环境的,而且调用CV的摄像头函数啥的也是可以运行的,不知道为啥会突然提示这个,然后自己测试了一下导入cv2,可以导入,但是确没有代码自动补全提示功能,感觉很奇怪?

问题分析 

        在PyCharm中使用OpenCV(opencv-python)时,自动补全功能有时候可能无法正常工作。这通常是由于配置问题或环境设置问题。以下是一些可能的解决方案,可以帮助你解决这个问题:

1.检查Python解释器

        确保PyCharm使用的是正确的Python解释器,并且该解释器已经安装了opencv-python包。

1.打开PyCharm并导航到 File > Settings(在Mac上是 PyCharm > Preferences)。
2.在左侧菜单中选择 Project: [YourProjectName] > Python Interpreter
3.确保选择了正确的解释器,并且在解释器列表中可以看到opencv-python

2.重建索引

        有时候,PyCharm的索引可能会出现问题,导致自动补全功能无法正常工作。你可以尝试重建索引:

1.导航到 File > Invalidate Caches / Restart
2.在弹出的对话框中选择 Invalidate and Restart
3.这将重建PyCharm的索引,可能会解决自动补全的问题。

3.安装完整的OpenCV模块

        有时候,使用opencv-python-headless可能会导致某些功能无法使用。如果你使用的是opencv-python-headless,可以尝试安装完整版本的opencv-python

pip uninstall opencv-python-headless
pip install opencv-python

4.更新PyCharm和插件

        确保你正在使用最新版本的PyCharm和相关插件。更新软件可以修复一些已知的bug。

1.导航到 Help > Check for Updates
2.也可以在 File > Settings > Plugins 中检查插件是否需要更新。

5.使用虚拟环境

        如果你没有使用虚拟环境,建议为项目创建一个虚拟环境。这可以帮助隔离项目的依赖关系,并且通常会解决一些与自动补全相关的问题。

1.创建虚拟环境:

python -m venv venv

2.激活虚拟环境并安装opencv-python

source venv/bin/activate   # 在Linux和macOS上
venv\Scripts\activate      # 在Windows上
pip install opencv-python

3.在PyCharm中配置项目使用这个虚拟环境。

6.检查代码提示设置

        确保你的代码提示设置是启用的:

1.导航到 File > Settings > Editor > Code Completion
2.检查是否启用了基本代码补全和智能代码补全。

7.使用cv2的明确导入

有时候,PyCharm可能无法识别某些动态导入的模块。确保在代码中显式导入cv2模块:

import cv2

解决尝试 

        自己对照以上原因仔细检查了一下,发现了自己的环境确实有点问题,原因如上面所说的第三条,安装了多个版本的opencv-python。 

于是乎自己按照提示,卸载了opencv-python-headless,本以为应该对症下药了,结果卸载之后运行出现如下问题:

这很明显是 opencv-python报错啊,倒是导入cv2确实可以的,于是自己用dir(cv2)查询了一下,发现所有和opencv相关的已经被卸载,只剩下一个主函数了 ,所以导入不报错但是运行报错,于是自己重现安装了一下opencv-python.安装之后发现功能正常,但是依然没有代码自动提示不全的功能。

最终解决

        自己经过多次查阅资料,发现将当前使用的环境文件夹中cv2.pyd文件(Ubuntu下为.so文件)复制到其上级目录下即可,自己的环境路径可以通过pip install opencv-python找到,一般在....\site-packages\cv2路径下,复制过后等待pycharm完成解析即可。。

 以上是自己的cv2.pyd路径,下面是复制之后的路径,要记住是复制过去,不是移动哦。

 

看一下效果(完美达到自己预期):

额外方法 

网络上大部分提供的是另外一种方法,但是我嫌弃麻烦没有尝试验证,在这里也和大家分享一下:

在site-package中修改cv2的__init__.py文件

找到你的python的site-packages文件夹,打开opencv的__init__.py文件修改__init__.py文件,你的文件路径在....\Lib\site-packages\cv2\__init__.py文件,将原来的代码注释掉(删掉也行),更改为:

import sys
import os
import importlib
os.environ["PATH"] += os.pathsep + os.path.dirname(os.path.realpath(__file__))
from .cv2 import *
globals().update(importlib.import_module('cv2.cv2').__dict__)

然后重启PyCharm。 

我按照上面的说明打开这个文件发现我的文件内容如下:

因为还涉及到下面还有别的函数啥的,而且是包的主要文件,我一是嫌弃麻烦,而是担心改这些有风险,会影响该库的使用,所以就没有尝试,有兴趣的同学可以验证尝试一下。 

opencv-python、headless和 contrib关系 区别

        因为前面在问题分析的时候有提到opencv-python-headless和opencv-python的问题,所以这里我也把自己查阅的这一方面信息补充说明一下

1.opencv-python

  • 用途:这是OpenCV的标准版本,包含了OpenCV的核心功能。
  • 包含内容:包括OpenCV主模块和一些基本的附加模块。支持图像处理、视频捕捉、机器学习等功能。
  • 依赖:需要完整的GUI库支持(如Qt或GTK),这意味着在某些服务器环境中可能不需要这些依赖。

2.opencv-python-headless

  • 用途:适用于不需要GUI功能的环境,特别是在服务器或容器化应用中。
  • 包含内容:与opencv-python类似,但不包括任何与GUI相关的功能。这意味着它不包含视频显示和图像显示窗口功能。
  • 优点:减少了包的大小和不必要的依赖,非常适合在无显示设备的服务器端应用程序中使用。

3.opencv-contrib-python

  • 用途:这是OpenCV的扩展版本,包含了OpenCV社区贡献的附加模块。
  • 包含内容:除了opencv-python中的内容,还包括opencv_contrib模块中的额外功能。这些模块包括一些更高级的功能和算法,如SIFT、SURF、背景分割、面部标记等。
  • 依赖:与opencv-python类似,需要完整的GUI库支持。

选择哪个版本?

  • GUI应用程序(例如,需要使用imshow显示图像):选择opencv-pythonopencv-contrib-python
  • 无头服务器应用程序(例如,运行在没有显示器的环境中):选择opencv-python-headless
  • 需要额外功能或模块(例如,使用SIFT、SURF等):选择opencv-contrib-python

选择哪个版本主要取决于你的使用场景和需求。如果你只需要基本的OpenCV功能并且不需要额外的模块,opencv-python就足够了。如果需要在不带图形界面的环境中运行,则可以使用opencv-python-headless。如果你的项目需要OpenCV社区贡献的额外模块,则可以使用opencv-contrib-python。 

 

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐