ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Windows下OpenCV安装全指南:Python版、C++版与源码编译

Windows下OpenCV安装全指南:Python版、C++版与源码编译 经常有人跑过来问我“Windows 下 OpenCV 到底怎么装”其实这个事儿本身不复杂但因为网上教程版本太老、Python 环境五花八门、C 版又牵扯 Visual Studio 配置导致很多人卡在半路。这篇文章我把 Windows 下 OpenCV 的下载安装从头到尾捋一遍Python 版、C 版、源码编译版都会讲到还会把那些教程里从来不写的坑单独拎出来说清楚适合刚入门 OpenCV 的读者也适合装过但总报错的老手对照排查。1. 动手之前先想清楚装 OpenCV 的三种方式1.1 你到底是需要 Python 版还是 C 版OpenCV 本身是一个 C 写的计算机视觉库但它提供了 Python、Java、JavaScript 等多种语言接口。很多新人上来就搜“OpenCV 下载安装”结果分不清自己到底要用哪个版本所以我建议你先问自己一个问题你后面打算用 Python 做图像处理项目还是用 C 做嵌入式、桌面端的视觉应用如果你只是想快速跑人脸识别、图像处理项目或者做毕设、做课程作业几乎所有人都应该选 Python 版因为它的安装过程就是一条 pip 命令不需要配置编译器省掉大量麻烦。如果你是做工业视觉、机器人、MFC/Qt 桌面应用或者要和 C#、Halcon 配合使用那就老老实实装 C 版。这里没有好坏之分纯粹看使用场景。顺便多说一句很多人问“opencv-python 和 opencv-contrib-python 有什么区别”简单说前者是 OpenCV 主仓库的官方模块后者额外包含了 contrib 扩展模块比如 SIFT、SURF 这些专利算法、卡尺工具相关的扩展、纹理识别等。日常学习和大部分项目装普通版就够了等你真的需要某个 contrib 里的算法时再换也不迟。1.2 三种安装路径的取舍pip、官方 exe、源码编译Windows 下装 OpenCV 主要有三条路第一条pip 安装 Python 版本适合绝大多数人最简单。第二条从 OpenCV 官网下载预编译的 Windows 安装包解压后配置 Visual Studio适合用 C 做桌面开发的开发者。第三条自己下载源码然后用 CMake 编译适合需要定制模块、开启特定硬件加速、或者要改内核代码的进阶用户。这里如果你只是学习使用完全没必要走这一步。这三条路我实际都走过最直观的感受是pip 方案五分钟内能跑起来官方包方案需要耐心理清 Visual Studio 各种配置项源码编译最麻烦但能让你对整个 OpenCV 的构建体系有真正的理解。后面我会按这三条线分别展开你根据自己情况挑着看。1.3 版本选择OpenCV 4.x 和 3.x 差在哪现在做技术选型建议直接选 OpenCV 4.x 系列因为它顺应了 C11/14 标准移除了很多老接口API 更干净而且从 4.5 开始对很多新硬件和格式支持更好。比如你搜到的 OpenCV 4.5.2 就原生支持 Code128 条形码识别这在做扫码、OCR 这类项目时特别方便。而 OpenCV 3.x 虽然网上教程存量巨大但接口比较老很多新模型文件加载不支持遇到问题查到的资料也容易过时。除非你的老项目还挂在 3.x 上否则不要在新的环境里装旧版本。Python 版的话直接装最新 4.x 就行不用纠结小版本号除了某些算法如 DNN 模块对版本敏感日常用起来差别不大。2. 准备工作Windows 下必须先搞定的两个环境问题2.1 Python 与 pip装的是哪个 Python 要心里有数装 Python 版 OpenCV 之前我真的要强调一下先搞清楚你电脑上到底有几个 Python 环境。我见过太多人本机装了 Anaconda又装了官方 Python还通过 Windows 应用商店装了一个结果在命令行敲pip install opencv-python装到了一个解释器上但 PyCharm 里面默认用的是另一个解释器最后就是ModuleNotFoundError: No module named cv2。所以装之前建议先打开命令行敲两句话python --version pip --version正常情况下输出里的 Python 路径应该是同一个。如果你用的是 Anaconda我更推荐直接在 Anaconda Prompt 里创建虚拟环境后再安装这样各个项目之间依赖不打架。我自己的习惯是先建立一个专门的环境conda create -n cv python3.9 conda activate cv然后在这个环境里装 OpenCV版本冲突的概率小很多。如果你的电脑上只有官方 Python 一个环境那直接进入下一步就行不用刻意多建个环境。2.2 C 版需要的编译器和 CMake 准备C 版本需要 Visual Studio建议直接用 Visual Studio 2019 或 2022 社区版免费而且对 OpenCV 4.x 支持非常成熟。装的时候记得勾选“使用 C 的桌面开发”这个工作负载否则后面新建项目时找不到 C 模板。CMake 只有在你做源码编译时才需要但如果只想用官方预编译包则不需要你自己装 CMake。注意一点4.x 时代的预编译包里面分vc15、vc16这样的目录vc后面的数字对应不同版本的 Visual Studio 生成工具集新版本 VS 一般能兼容老的但如果你用 VS2022 打开老项目报一堆平台工具集错误通常就是因为这个不匹配。3. Python 版 OpenCV 的下载安装实操3.1 用 pip 安装 opencv-python 和 opencv-contrib-python确认环境没问题后直接在命令行执行pip install opencv-python如果你需要 contrib 扩展模块安装这条pip install opencv-contrib-python这里要特别提醒一个坑不要同时安装opencv-python和opencv-contrib-python因为这两个包提供的模块名都是cv2同时装会出现文件覆盖或者 import 混乱的问题。你需要哪个装哪个即可。如果之前已经误装了其中一个想切换的话需要先卸载pip uninstall opencv-python opencv-contrib-python然后只装你要的那个实测下来这样最干净。另外国内用户在 pip 下载时经常会遇到速度极慢或者超时的问题这种情况可以用国内镜像源我一般用清华源速度提升非常明显。命令如下pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple安装完成后可以在命令行里快速验证一下是否确实装好了。3.2 验证安装import cv2 与版本打印打开命令行依次输入python import cv2 print(cv2.__version__)如果能正常打印出版本号比如4.9.0说明安装已经成功。如果报错No module named cv2绝大多数情况是你命令行使用的解释器和你代码运行时使用的解释器不是同一个。解决办法很简单在 PyCharm 里打开File - Settings - Project - Python Interpreter把解释器路径切换到你刚安装 OpenCV 的那个环境或者直接在 PyCharm 的 Terminal 里用pip install这样和项目解释器保持一致。3.3 头一次运行摄像头和读图的完整 demo装好之后我建议你立刻跑一个小 demo不要等用的时候才发现环境有问题。先用最简单的方式读一张图片验证图像处理基础流程import cv2 # 读取本地图片注意路径不要有中文 img cv2.imread(test.jpg) print(img.shape) # 显示图片 cv2.imshow(test, img) cv2.waitKey(0) cv2.destroyAllWindows()这里很多人会疑惑cv2.waitKey(0)是干嘛的。它实际上是等待键盘事件参数 0 表示无限等待按键否则窗口显示出来会一闪而过。网上搜到 “waitKey 为啥没参数时会卡主”原因就是waitKey()会默认使用一个很短的延时图像窗口事件还没刷新就被关闭了给人的感觉是程序卡住了。正确的做法是给waitKey传一个毫秒数或者 0。接下来试一下摄像头调用import cv2 cap cv2.VideoCapture(0) while True: ret, frame cap.read() if not ret: break cv2.imshow(camera, frame) if cv2.waitKey(1) 0xFF ord(q): break cap.release() cv2.destroyAllWindows()如果摄像头画面能弹出来说明你的 OpenCV 安装能正常读取视频设备。至于“OpenCV 调用相机的原理”其实就是通过 VideoCapture 封装了 Windows 下的 V4L2 或 DirectShow 驱动接口你不需要关心底层驱动细节但要知道摄像头是否被其他程序占用会直接影响cap.read()的返回结果。如果ret一直为 False先检查摄像头是否被 QQ、微信这类软件占用。4. C 版 OpenCV 的下载安装实操4.1 从官网下载 release 包并解压如果确定要用 C 版第一步是打开 OpenCV 官网的 releases 页面找到 Windows 版本对应的安装包下载。它其实是一个自解压程序双击后会让你选择解压目录本质上就是释放一堆文件。我个人的习惯是解压到D:\opencv这种全英文、无空格的路径下因为后续配置 VS 工程时如果路径带中文或空格一些老模块会在编译时报错虽然新版本改善了很多但没必要给自己埋坑。解压完成后目录结构大概是这样的D:\opencv\ build\ include\ opencv2\ x64\ vc15\ bin\ lib\ ... sources\其中include里放的是头文件x64\vc15\bin里面是运行所需的 DLL 文件x64\vc15\lib里是链接用的静态库文件。看到这个结构你应该就能理解为什么后面的配置要分两处了头文件告诉编译器函数长什么样lib 文件告诉链接器去哪里找实现DLL 文件是程序运行时真正被加载的代码。4.2 配置环境变量 PATH 的细节把D:\opencv\build\x64\vc15\bin这个路径添加到系统环境变量 PATH 里这一步骤不可省略。如果不添加编译出来的程序运行时会出现“找不到 opencv_world4xx.dll”之类的错误。实际上即使你不想改系统环境变量也可以把自己项目的bin目录设为当前目录或者把 DLL 手动复制到 exe 旁边但最省事的还是配置好 PATH。这里有个容易忽略的细节注意需要添加的是bin目录不是lib目录也不是 build 根目录。加错了路径等于没加。配置完后建议重开一个命令行窗口输入echo %PATH%确认一下路径是否真的存在。如果之前的命令行窗口是改环境变量之前打开的它不会自动刷新这就是很多人配完环境变量后依然报错的原因。4.3 Visual Studio 项目配置包含目录、库目录、附加依赖项创建一个新的空 C 项目后需要在自己项目的属性页里做三件事配置包含目录、配置库目录、配置附加依赖项。这三样缺一不可。在解决方案资源管理器里右键项目名选择“属性”然后在顶部先把配置切换为“所有配置”平台切换为x64。如果你默认是 Win32后面会链接失败因为 OpenCV 预编译包只提供了 64 位版本除非你自己从源码编出 32 位的。接下来在VC 目录 - 包含目录中添加D:\opencv\build\include D:\opencv\build\include\opencv2这里的opencv2目录其实可以不加因为opencv2头文件本身是通过相对路径引用的但加上也不会有问题。然后在VC 目录 - 库目录中添加上D:\opencv\build\x64\vc15\lib最后在链接器 - 输入 - 附加依赖项里加上具体的 lib 文件名。不同版本 OpenCV 的 lib 文件名不同4.x 一般叫这个格式opencv_world4xx.lib其中4xx是具体版本号比如 OpenCV 4.5.2 对应opencv_world452.libOpenCV 4.10.0 对应opencv_world4100.lib。你可以在lib目录里看一眼照实际文件名填写。Debug 模式一般对应带d后缀的版本比如opencv_world4100d.libRelease 模式则用不带d的。实际使用中很多人图省事一直用 Debug 编译结果发现链接报一堆错误原因大多是 Debug/Release 的 lib 配反了。配置完成后写一个小程序验证一下#include opencv2/opencv.hpp #include iostream int main() { cv::Mat img cv::imread(test.jpg); if (img.empty()) { std::cout image is empty std::endl; return -1; } cv::imshow(test, img); cv::waitKey(0); return 0; }编译运行能看到图片说明 C 版和 Visual Studio 的衔接没有问题。后面的姿势就可以开始正式做项目了比如用 C 调 Halcon 和 OpenCV 混合开发、做 Qt 桌面应用等核心配置路径都一样。5. 进阶玩法源码编译 OpenCV 到底有没有必要5.1 为什么要自己编译contrib 模块和优化指令集很多人看到这里会问既然官方预编译包这么好为什么还有那么多人折腾源码编译原因主要有三个。第一官方预编译包里没有包含 contrib 扩展模块比如一些特征点算法、卡尺工具、aruco 等你必须自己编译才能把这些模块打包进去。第二官方包默认开启的指令集优化是比较保守的如果你能确定部署电脑的 CPU 支持 AVX2、AVX512编译时手动开启这些选项图像处理速度能提升不少尤其是在做大分辨率图像处理和实时视频流处理时差距明显。第三一些研究人员要改 OpenCV 源码或者要在项目里加自己的自定义模块这时候就绕不开源码编译了。如果你只是调用已有算法做图像处理项目我劝你还是别折腾编译直接用预编译包足以应付绝大多数场景。我见过有人为了一个 SIFT 算法花了一整天编译最后成果还不如直接用 contrib 的 pip 包来得方便。5.2 CMake 生成 VS 工程的关键步骤源码编译的基本流程是这样的先安装 CMake然后在 OpenCV 源码根目录的sources文件夹里运行 CMake 的 GUI 工具或者用命令行。GUI 操作更直观打开 CMake在Where is the source code里选择解压出来的sources目录在Where to build the binaries里选择一个新的构建目录比如build点击 Configure选择你需要的 Visual Studio 版本和平台然后等 CMake 读取完配置信息。第一次 Configure 之后界面里会出现很多选项。常用的是这几个BUILD_opencv_world设为 ON 可以生成一个大的 world 库类似于官方预编译包的opencv_world4xx方便链接但不太利于模块化管理新手建议 ON。BUILD_opencv_python3如果你想同时生成 Python 接口把这个设为 ON前提是本机装好了 Python 和 NumPy。OPENCV_EXTRA_MODULES_PATH如果你下载了 contrib 源码把这个路径填进去contrib 模块也会一起编译。CMAKE_BUILD_TYPE建议先编 Release 版本。配置好后点 Generate生成 Visual Studio 解决方案然后在 VS 里打开生成的OpenCV.sln右键ALL_BUILD项目选择生成。编译时间取决于机器性能可能从十几分钟到一小时不等而且这个过程非常吃内存内存低于 8G 的话建议别同时开一堆软件。编译完成后在构建目录下的lib和bin里就能找到你亲手编译出来的库文件。把install这个项目也编译一遍它可以把头文件、库、DLL 统一输出到一个目录方便后续配置。5.3 编译后的安装与验证体会如果你经历了源码编译这一步后续的配置思路其实和官方包一模一样头文件换成源码编译输出目录里的include库目录指向编译产物的libDLL 指向编译产物的bin。唯一区别就是这些文件是你自己生成的所以不会有版本不匹配的问题。我自己的经验是源码编译最大的价值不是“用”而是“懂”。编译过一次之后你对 OpenCV 的目录结构、模块划分、CMake 的工作方式都会有一个脱胎换骨式的理解。以后再遇到视频编解码问题、GStreamer 集成问题、DNN 模型加载问题至少知道该去翻哪块代码。但话说回来这种理解对日常项目并不值那么多时间所以我一般只推荐给有多余精力或者有硬性需求的人去做。6. 折腾过程中最容易踩的坑与排查速查表6.1 报错汇总表和解决方向安装 OpenCV 有问题的人实在太多我把这些年见过的高频报错整理成了一张表照着对号入座就行。报错信息常见原因解决方向ModuleNotFoundError: No module named cv2pip 装错了 Python 环境或者根本没装上检查当前命令行 / IDE 的解释器路径在项目解释器对应的终端里重新 pip installDLL load failed while importing cv2opencv 依赖的运行时 DLL 缺失常见于精简版 Windows 系统缺少 VC 运行库安装 Visual C Redistributable 2015-2022 x64编译 C 项目时报“找不到 opencv_world4xx.lib”忽略配置附加依赖项或 Debug/Release 混用去属性页补上 lib 名称检查 Debug 用带d后缀的 libC 项目编译通过但运行时提示找不到 opencv_world4xx.dllPATH 没配置或 DLL 不在 exe 同目录把opencv\build\x64\vc15\bin正确加入 PATHcv2.imread返回 None图片路径错误或者图片文件损坏换绝对路径路径中不要出现中文cap.read()一直返回 False摄像头被其他软件占用或驱动问题关掉所有占用摄像头的软件换个 USB 接口安装速度极慢或超时默认源在境外网络波动用清华、阿里等国内镜像源同时 import cv2 时版本不是你想要的多个环境存在pip 和 python 不匹配用where python、where pip查看实际路径这张表不是万能的但覆盖了 90% 的安装类问题。如果遇到表里没有的报错最有效的办法是把完整报错信息复制出来直接搜最后一行一般都能找到类似情况的分析。6.2 关于 waitKey 无参数卡住和图像坐标系的理解安装好之后很多人写的第一个程序就是读图、显示、等待按键。这里面最容易被误解的就是waitKey。有一个热词是“waitKey 为啥没参数时会卡主”其实就是官方文档对waitKey的参数定义不是“要不要卡住”而是“等待多少毫秒”。不传参数时默认值是 0但这里有个历史包袱在 Windows 和 Linux 平台上默认实现会有一些差异导致在极短延时下图像窗口事件得不到刷新看起来像卡死。所以我的习惯是写cv2.waitKey(0)表示无限等待写cv2.waitKey(1)表示每 1 毫秒刷新一次想退出时按q。另一个容易被问起的是 OpenCV 的图像坐标系问题。OpenCV 里的图像坐标原点在左上角x 轴向右为正y 轴向下为正这和我们平时数学里 y 向上的坐标系是反的。画矩形、画点、做仿射变换的时候很多人会在这个细节上栽跟头尤其是做卡尺工具、测量类项目时坐标系搞反了测量结果直接就错。你可以用下面这段代码快速验证一下import cv2 import numpy as np img np.zeros((300, 300, 3), dtypenp.uint8) cv2.circle(img, (150, 50), 10, (0, 0, 255), -1) # 画在靠上的位置 cv2.imshow(origin, img) cv2.waitKey(0)这个点看起来会在图像的上方就是因为 y 向下为正y50 在高度 300 的图像中属于上半部分。理解了这一点后续做人脸识别画框、目标检测标注时就不会把坐标换算搞错。6.3 几个装了多年 OpenCV 后总结的小习惯最后分享几个我自己长期养成的习惯不一定在教程里能学到。第一永远不要贪多装一堆 opencv 相关包。有些人为了一个女人脸识别 api把opencv-python、opencv-contrib-python、opencv-python-headless全装了一遍最后程序跑起来不知道 import 的是哪个版本。正确的做法是确定自己需要什么只装一个。如果是服务器上不显示界面的场景可以用opencv-python-headless代替普通版它不带 GUI 模块体积更小也省去了一些服务器上 GUI 库缺失的报错。第二C 项目建议把 OpenCV 的 DLL 放到 exe 输出目录。虽然配置 PATH 也能运行但如果你要把程序发给同事或部署到其他机器上对方不一定配过 PATH。我一般会在项目后期通过 “生成后事件” 把 DLL 自动复制到输出目录命令是xcopy /y D:\opencv\build\x64\vc15\bin\*.dll $(OutDir)这样生成的 exe 放在任何 Windows 机器上只要装了 VC 运行库就能跑。第三给 OpenCV 留一个固定的盘符目录不要跟项目文件混在一起。很多人喜欢把 OpenCV 解压到项目目录里结果每个项目都有一份巨大的 OpenCV不仅占磁盘还容易在不同项目里用到不同版本而混淆。统一放在一个目录好比一个固定仓库项目里只管引用遇到版本升级换一个路径就好。反正装 OpenCV 这件事Python 版就是一条 pip 命令C 版就是下载解压加三处配置源码编译才需要花时间。熟手从头到尾十分钟能搞定新手第一次折腾一两个小时也很正常关键在于理解每一步在干什么。以后谁再问你 Windows 下 OpenCV 怎么装你可以直接把这份东西甩给他。
返回列表