windows手动编译openCV源码 Clion 配置 opencv

发布时间:2024-06-24 21:21:01 作者:yexindonglai@163.com 阅读(561)

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行,表示成功

  1. Configuring done (1037.1s)
  2. 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,可使用多核进行编译,输入以下命令

  1. # 单线程编译 -速递较慢,但是不会卡死
  2. mingw32-make-posix
  3. # 使用多核cpu进行编译- 速度较快,但是有可能会卡死
  4. mingw32-make-posix -j8

编译完成后显示以下信息表示成功

接下来我们到build目录下的lib目录看看,这些就是编译后的静态库文件

3.1、编译过程报错解决

3.1.1、’D:\Program’ 不是内部或外部命令,也不是可运行的程序

全部报错信息如下

  1. [ 42%] Building RC object modules/core/CMakeFiles/opencv_core.dir/vs_version.rc.obj
  2. 'D:\Program' 不是内部或外部命令,也不是可运行的程序
  3. 或批处理文件。
  4. D:\Program Files\mingw64-posix\bin\windres.exe: preprocessing failed.
  5. 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
  6. mingw32-make-posix[2]: *** Waiting for unfinished jobs....
  7. mingw32-make-posix[1]: *** [CMakeFiles\Makefile2:2004: modules/core/CMakeFiles/opencv_core.dir/all] Error 2
  8. 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、安装

执行以下命令,将刚刚编译的文件整合到一起

  1. 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 内容

  1. cmake_minimum_required(VERSION 3.27)
  2. project(YourProjectName)
  3. set(CMAKE_CXX_STANDARD 11)
  4. # 设置OpenCV的路径(根据你自己的安装路径进行更改)
  5. set(OpenCV_DIR "D:\\cpp\\opencv\\sources\\build")
  6. find_package(OpenCV REQUIRED)
  7. include_directories(${OpenCV_INCLUDE_DIRS})
  8. add_executable(YourProjectName main.cpp)
  9. target_link_libraries(YourProjectName ${OpenCV_LIBS})

main.cpp内容

  1. #include <iostream>
  2. #include<opencv2/opencv.hpp>
  3. using namespace std;
  4. using namespace cv;
  5. int main(int argc, char** argv){
  6. Mat src;// 初始化一个操作对象
  7. src = imread(R"(D:\Users\w9033927\Pictures\Image_20240125144941.png)");// 自己找一张图片,路径不能有中文
  8. if (!src.data)// 判断图片是否加载进来
  9. {
  10. cout << "不能加载图片" << endl;
  11. return -1;
  12. }
  13. string name = "loaded img" ;
  14. namedWindow(name, WINDOW_AUTOSIZE);
  15. imshow(name, src); // winname参数内命名一致,才能显示在一个窗口
  16. waitKey(0); // 等待用户按下任意键结束程序
  17. // 释放窗口和图像资源
  18. cv::destroyAllWindows();
  19. src.release();
  20. return 0;
  21. }

整个项目目录如下

如果刚刚安装后没有配置环境变量、或者安装环境变量后未重启,运行main函数就会报以下错误

解决方案一、

要解决这个报错,得将刚刚安装后的bin目录配置到运行里面,打开运行的配置

然后 把刚刚记下来的bin目录路径复制到Working directory 选项

保存退出,然后再次运行就可以正常展示图片了;

解决方案二、

按照 4.1 步骤的操作进行配置环境变量并重启

关键字OpenCV