Windows下编译opencv并使用VsCode+Cmake工具编写测试程序

Windows下编译opencv并使用VsCode+Cmake工具编写测试程序

      • 1.准备环境
      • 2.生成MakeFile并编译Opencv
      • 3.测试:在VsCode中使用Cmake编译Opencv项目
      • 4.结语

在windows下利用cmake工具编译一个opencv项目的时候,在make的中总会报错:

D:/ProgramFiles/opencv-3.4.8/modules/core/include/opencv2/core/cvstd.hpp:648: undefined reference to `cv::String::deallocate()'
CMakeFiles\test.dir/objects.a(main.cpp.obj): In function `cv::String::operator=(cv::String const&)':
D:/ProgramFiles/opencv-3.4.8/modules/core/include/opencv2/core/cvstd.hpp:656: undefined reference to `cv::String::deallocate()'
CMakeFiles\test.dir/objects.a(main.cpp.obj): In function `cv::Mat::~Mat()':

我使用的opencv是下载的编译好的包,直接安装解压的。后来在stackoverflow上看到一种说法,需要自己编译opencv才行,于是我开始行动了。

1.准备环境

  • WinGW,提取码:7s7c
  1. 下载好之后,将压缩包解压到任意路径。

  2. 然后添加环境变量:右键我的电脑——属性——高级系统设计——环境变量——选择用户变量里的Path,点击编辑——新建——将刚才解压的文件中的bin路径*\WinGW\mingw64\bin填写进去,*是根目录,根据自己的路径修改。点击确定。

  3. 进入bin目录,将mingw32-make.exe复制一个副本,然后改名make.exe.
    在这里插入图片描述

  4. 此时win+R调出CMD命令,输入cmake --version应该出现cmake的版本号,表明配置成功。

  • Opencv,提取码:w42u
    或者去opencv官网下载:https://opencv.org/releases/,选择自己需要的opencv版本Windows下编译opencv并使用VsCode+Cmake工具编写测试程序_第1张图片
    我们下载源码,下载好之后,解压到任意位置。

    附OpenCV的Win安装包:OpenCV3.4.11 ,提取码:lefd

  • Cmake,提取码:b6fd

    下载好之后直接解压到任意位置。和WinGW一样将解压出的bin目录添加到环境变量路径Path中。然后可以在CMD中输入cmake --version,如果有版本号则配置成功。

至此准备工作完成。

2.生成MakeFile并编译Opencv

CMD中输入cmake-gui会跳出cmake的图形化界面。如果没有跳出来的话,可能是环境变量配置出问题了,检查能否输出cmake的版本号,如果能的话进入目录*\cmake-3.18.3-win64-x64\bin,应该有cmake-gui.exe可执行文件,双击点开。

Windows下编译opencv并使用VsCode+Cmake工具编写测试程序_第2张图片

  • 选择source目录为解压的opencv源码根目录

  • 在opencv根目录下创建一个文件夹,命名为build,在cmake-gui界面中选择Build目录为新建的build目录

  • 点击configure

Windows下编译opencv并使用VsCode+Cmake工具编写测试程序_第3张图片

编译器C和C++选择*/WinGW/mingw64/bin/x86_64-w64-mingw32-gcc.exe*/WinGW/mingw64/bin/x86_64-w64-mingw32-g++.exe。点击Finish。

  • 然后开始配置。

    • 在配置的过程中可能会报错下载超时,不用担心,我们去下载这三个文件。可以打开build目录下的CMakeDownloadLog.txt,搜索cmake_download,应该能搜索到三个,后面第一个路径是你的本地保存路径,第二个路径是下载路径,我们需要分别在三个下载路径下下载好这三个下载失败的文件。这三个文件都需要外网来下载,我提供我下载好的文件,我的opencv版本是opencv-3.4.8,我没试过版本不同能不能用我下载好的文件,如果不行你需要自己去下载。

      opencv_ffmpeg_64.dll,提取码:u9mq

      opencv_ffmpeg.dll,提取码:j94k

      ffmpeg_version.cmake,提取码:ugok

    • 下载好之后,首先将三个文件移动到*\opencv-3.4.8\.cache\ffmpeg目录下。

      然后我们需要改名字,打开CMD,使用cd命令进入到ffmpeg文件夹下,然后使用命令certutil -hashfile ffmpeg_version.cmake MD5分别获取三个文件的MD5码,将文件名改成md5-filename的格式,如:在这里插入图片描述

    • 重新点击configure按钮,可以发现没有报错了。如果报错说安装了python高版本,需要python2.7,可以不用管。如果后面行不通的话,可以自己去官网下载python2.7版本,然后异曲同工配置python的环境变量。

    • 点击Generate生成Makefile文件。

    至此,编译工作已经完成了一大半

  • 接下来需要使用WinGW进行make。这里可以直接使用CMD命令行。我使用的是VsCode.这里没有差异。推荐使用命令行,不用额外的配置了。

    在命令行中使用cd进入到opencv目录里的build文件夹,然后输入make -j8命令进行编译,这里-j8是使用多线程的意思,如果电脑不支持可以直接输入make。接下来就是等待,大约15分钟。

    编译完成之后,可以进入到build目录下,bin文件夹里有许多可执行文件,lib文件夹里有生成的一些库。

  • 最后,将编译好的Opencv加入到环境变量中。即把bin文件夹所在目录加入到Path路径中。编译Opencv完成。

3.测试:在VsCode中使用Cmake编译Opencv项目

假设VsCode已经配置好了,如果没有配置好可以看我的这一篇博客,过程很简单:VsCode配置

  1. 首先新建一个文件夹。然后建子文件夹build和src,新建文本CMakeLists.txt,名称不能有错误,否则VsCode的Cmake工具检测不到CMakeLists.txt无法进行Cmake生成Makefile。随便放一张图片。最终文件夹是这个样子的:

Windows下编译opencv并使用VsCode+Cmake工具编写测试程序_第4张图片

  1. 目前所有文件夹和文本都是空的,我们一步步来填写。首先打开CMakeLists.txt,将下面的内容复制到其中:

    cmake_minimum_required(VERSION 3.4)#最小版本要求
    project(opencv_test)#工程名称
    
    ##set(OpenCV_DIR "D:\\ProgramFiles\\opencv-3.4.8\\build")#如果报错找不到OpenCV的话,将注释取消掉,然后修改成自己的目录
    find_package(OpenCV REQUIRED)
    include_directories(${OpenCV_INCLUDE_DIRS})
    link_directories(${OpenCV_LIBRARY_DIRS})
    
    aux_source_directory(./src SrcFiles)
    set(EXECUTABLE_OUTPUT_PATH ../bin)#可执行文件的输出路径
    
    add_executable(test ${SrcFiles})
    target_link_libraries(test ${OpenCV_LIBS})#将OpenCV库链接到你的可执行文件上
    

    然后重启VsCode,会发现VsCode开始自动配置Cmake

  2. 在src目录下新建main.cpp

    #include"opencv2\opencv.hpp"
    #include
    using namespace std;
    using namespace cv;
    
    int main()
    {
        Mat img = imread("../1.jpg");
        imshow("test",img);
        waitKey(0);
    }
    
  3. 打开一个新的终端

Windows下编译opencv并使用VsCode+Cmake工具编写测试程序_第5张图片

输入:

cd build
cmake ..
make
..\bin\test.exe

如果前面的步骤都没有错的话,此时应该已经显示出图片了。

4.结语

问题解决了,但是还是需要探讨一下原因。

你可能感兴趣的:(Windows下编译opencv并使用VsCode+Cmake工具编写测试程序)