1、前置工作
系统
win10 或 win11
编译软件 mingw64
mingw64 有2个版本,分别是
x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0.7z
- 这个包是针对 POSIX 兼容的操作系统(如 Linux、macOS 等)的 64 位 MinGW-w64 编译器。
- “posix” 表示使用 POSIX 线程库。
- “sjlj” 表示使用 setjmp/longjmp 异常处理机制。
- “rt_v6” 表示使用版本 6 的 C 运行时库。
x86_64-8.1.0-release-win32-sjlj-rt_v6-rev0.7z
这 个包是针对 Windows 操作系统的 64 位 MinGW-w64 编译器。
"win32" 表示使用 Windows 原生 API。
其他标识与上面的 POSIX 版本一致。
我们要下载posix线程版本mingw64: x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0.7z 下载地址:点我下载
必须用这个版本的,否则编译会报错,这是因为编译opencv时必须要使用posix版本的多线程,而不是选择win32的多线程方案;报错信息参考这个文档:http://blog.itjsz.com/windows-%E7%BC%96%E8%AF%91-c-%E6%8A%A5%E9%94%99-error-mutex-in-namespace-std-does-not-name-a-type/
构建软件
cmake 3.27.1
opencv
使用以下2个版本都经过测试可以通过本文章的教程顺利编译通过,任选其一即可,建议使用 3.4.16 版本,因为opencv4.x版本以后删减了一些东西;
opencv-4.8.0
下载地址:https://github.com/opencv/opencv/releases/tag/4.8.0
下载windows版本,选择:opencv-4.8.0-windows.exe
opencv-3.4.16
下载地址:https://github.com/opencv/opencv/releases/tag/3.4.16
下载windows版本,选择:opencv-3.4.16-vc14_vc15.exe
2、生成
生成前的准备工作
先打开 opencv-4.8.0-windows.exe
,将其解压到 D:\cpp\opencv\
目录
然后打开cmake GUI
打开后如下图,输入源代码文件夹和编译文件夹;
源代码文件夹
D:\cpp\opencv\sources编译文件夹
D:\cpp\opencv\sources\build- 勾选
Advanced
复选框, 意思是开启高级选项,将缓存的变量标记为高级变量,使用cmake GUI编译时会展示出更多的选项
然后点击下面的左边的 Configure 按钮
接下来会弹出一个窗口,让我们选择生成方式
- 选择生成器 makefile 版本 为
MinGW Makefiles
- Specify native compilers 选项表示指定本机编译器
接下来会让你选择本机编译器的地址,注意这里不要选错,一定要选择 posix线程版本的 mingw64目录,
- c: 表示gcc的所在位置
- C++:表示G++ 的所在位置
Generate
点击 Generate
如果看到以下2行,表示成功
Configuring done (1037.1s)
Generating done (6.9s)
3、编译
因为我自己的电脑上安装了多个mingw版本,所以在编译之前,我自己将posix版本的 mingw32-make.exe
改成了 mingw32-make-posix.exe
然后打开cmd窗口,进入 目录:D:\cpp\opencv\sources\build
, 执行刚刚修改后的make命令:mingw32-make-posix
,开始编译,需要一些时间;
如果你的电脑是多核cpu,如果是16核的cpu,可使用多核进行编译,输入以下命令
# 单线程编译 -速递较慢,但是不会卡死
mingw32-make-posix
# 使用多核cpu进行编译- 速度较快,但是有可能会卡死
mingw32-make-posix -j8
编译完成后显示以下信息表示成功
接下来我们到build目录下的lib目录看看,这些就是编译后的静态库文件
3.1、编译过程报错解决
3.1.1、’D:\Program’ 不是内部或外部命令,也不是可运行的程序
全部报错信息如下
[ 42%] Building RC object modules/core/CMakeFiles/opencv_core.dir/vs_version.rc.obj
'D:\Program' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
D:\Program Files\mingw64-posix\bin\windres.exe: preprocessing failed.
mingw32-make-posix[2]: *** [modules\core\CMakeFiles\opencv_core.dir\build.make:1616: modules/core/CMakeFiles/opencv_core.dir/vs_version.rc.obj] Error 1
mingw32-make-posix[2]: *** Waiting for unfinished jobs....
mingw32-make-posix[1]: *** [CMakeFiles\Makefile2:2004: modules/core/CMakeFiles/opencv_core.dir/all] Error 2
mingw32-make-posix: *** [Makefile:165: all] Error 2
原因:
设置的mingw64的环境变量为:D:\Program Files\mingw64-posix\bin
,中间有个空格,但是运行时,直接将空格后面的字符给忽略了;
解决方案:
将mingw64放到没有空格的路径中,如:D:\mingw64-posix\bin
最后再次执行编译命令:mingw32-make-posix -j8
4、安装
执行以下命令,将刚刚编译的文件整合到一起
mingw32-make-posix install
安装到最后会将关键的程序安装到mingw/bin目录,这时候我们需要记住这个bin目录,最好复制下来:C:/Program Files (x86)/x64/mingw/bin
(等下clion运行的时候需要用到,如果未配置环境变量,就需要将这个bin目录配置clion的 Working directory 里面)
4.1、配置环境变量并重启
之后将刚刚安装的bin目录配置到环境变量(可选),到此外部的配置已全部OK,重启电脑,(注意:必须重启,否则环境变量不生效
)
5、clion 运行opencv
打开 clion ,创建一个c++项目
新建2个文件,CMakeLists.txt 、 main.cpp
CMakeLists.txt 内容
cmake_minimum_required(VERSION 3.27)
project(YourProjectName)
set(CMAKE_CXX_STANDARD 11)
# 设置OpenCV的路径(根据你自己的安装路径进行更改)
set(OpenCV_DIR "D:\\cpp\\opencv\\sources\\build")
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(YourProjectName main.cpp)
target_link_libraries(YourProjectName ${OpenCV_LIBS})
main.cpp内容
#include <iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc, char** argv){
Mat src;// 初始化一个操作对象
src = imread(R"(D:\Users\w9033927\Pictures\Image_20240125144941.png)");// 自己找一张图片,路径不能有中文
if (!src.data)// 判断图片是否加载进来
{
cout << "不能加载图片" << endl;
return -1;
}
string name = "loaded img" ;
namedWindow(name, WINDOW_AUTOSIZE);
imshow(name, src); // winname参数内命名一致,才能显示在一个窗口
waitKey(0); // 等待用户按下任意键结束程序
// 释放窗口和图像资源
cv::destroyAllWindows();
src.release();
return 0;
}
整个项目目录如下
如果刚刚安装后没有配置环境变量、或者安装环境变量后未重启,运行main函数就会报以下错误
解决方案一、
要解决这个报错,得将刚刚安装后的bin目录配置到运行里面,打开运行的配置
然后 把刚刚记下来的bin目录路径复制到Working directory
选项
保存退出,然后再次运行就可以正常展示图片了;
解决方案二、
按照 4.1 步骤的操作进行配置环境变量并重启