OpenCV4学习笔记(1.0)换一种方式从源码编译、安装 | OpenCV4.3.0以及Contrib | Win10 | CMake-GUI | VS2019 | HTTP代理

本篇博客会持续更新,将自己的心得体会、遇到的问题和解决方案记录下来。

目标

  • 源码编译的方式安装OpenCV与相应的Contrib扩展模块,但是不使用CUDA的相关功能(我的机器上没有配置CUDA的开发环境,所以无法编译CUDA相关的文件)
  • 使用HTTP代理解决CMake的Configure、Generate阶段的文件下载失败问题,而非手动下载必要文件。
  • 使用新建配置文件的方法在VS2019上配置OpenCV开发环境,后续工程直接导入已有的配置文件即可,无需重复配置。

ATTENTION!

有些事情真的只有经历了,才相信它确实存在,但是这种事还是想少经历点好。。。唉,眼泪好咸。。。

  • 所有演示操作均已本人的设备、环境为例,读者可以根据需要自行修改、配置,需要遵守的规则我都会说明。
  • 有些操作过程可能需要等待较长的时间,请一定要耐心等待,中途绝对不能强制停止,特别是使用VS的编译过程,强制停止可能会导致正在编译的文件损坏,甚至无法进行第二次编译。
  • 使用命令提示符和PowerShell均可(之后统称为控制台,可以互相替换),但是必须运行在管理员权限下。
  • 如果你的环境本身无法进行CUDA开发,那么就不能在预编译的时候选择CUDA的相关选项。不然的话,之后使用VS编译的时候会由于缺少相关文件,而发生编译错误。
  • 这个教程只适用于Win10系统,Mac和Linux系统预编译之前,需要手动安装大量的依赖库,安装不全会导致编译完的OpenCV中的某些方法损坏,无法正常使用,此时只能安装必要依赖库后,重新预编译和编译OpenCV,才能正常使用。

下载CMake、配置CMake环境变量、下载OpenCV和OpenCV_Contrib源码、下载VS2019

下载CMake

  • 下载Installer即可,后缀名为.msi,下载完成后即可直接安装。
  • 这里我使用的是3.17.0版本,建议读者也使用该版本,当然也可以根据需要自行选择其他版本下载、安装。

配置CMake环境变量

  • 因为需要从控制台启动CMake,所以需要将其添加到系统环境变量中,添加环境变量的操作在此不做演示,操作步骤与配置g++、gcc的环境变量是完全相同的。
  • 配置完成后,以管理员身份运行控制台,输入cmake-gui,安装成功会弹出cmake-gui界面,否则不成功。

下载OpenCV和OpenCV_Contrib源码

到官方的Github里下载这两份源码,注意版本必须匹配,这里演示的版本为4.3.0。

下载OpenCV源码

  • 下载后缀名为.zip格式的源码即可。
  • 待下载完成后,在本地的目标文件夹下解压,保证文件目录除盘符名之外的其他所有文件夹名称均无中文,目标文件夹就是希望OpenCV安装到的文件夹,安装完成之后不能修改!

下载OpenCV_Contrib源码

  • 下载后缀名为.zip格式的源码即可。

  • 待下载完成后,在本地的目标文件夹下解压,保证文件目录除盘符名之外的其他所有文件夹名称均无中文

  • OpenCV和OpenCV_Contrib的源码,路径之间不互相影响,没有特定的包含关系,但是编译、安装完成之后不能随意挪动OpenCV_Contrib包的位置。

下载VS2019

使用CMake预编译OpenCV源码

配置HTTP代理

这里是和其他博客最与众不同的地方,先来说一下原因。其实很简单,是因为按照网上大部分博客给出的解决方案,即手动下载文件放到指定目录的方法在我的机器上无效,而且暂时还没有找出问题的原因。最后只能放弃这个方法,另寻他路。

由于相关的资料十分匮乏,单就博客来说,大部分国内的博客都是手动下载缺失文件,而国外的博客则没有这些顾虑,自然就没有对这个问题的讨论,所以这部分的摸索属实不易。

我不是专门学习计算机网络相关的专业,所以有些用词可能不当,如有误导或错误,望大家指出,定及时更正!

需要借助代理服务器来下载编译过程中所需的文件,所以需要先对代理软件进行配置。

  1. 打开确保可以使用的代理软件(各种协议使用的软件不同,但是一般都可以转换成HTTP协议的代理,注意找一下自己使用软件的相关设置选项),确定同时开启了HTTP代理。

  2. 将HTTP代理服务器的IP地址和端口号复制下来,注意一定是HTTP代理服务器的IP地址和端口号,而不是SOCKS4/5代理服务器的IP地址和端口号,如果弄错了是无法使用的,下面以我的为例:

  3. 将HTTP代理服务器的IP地址和端口号添加到环境变量中,按理来说,可以在控制台中设置临时的HTTP代理,但是我这么设置是无效的,而添加到环境变量中是有效的。

    具体格式如下:(两行都需要添加

    • 这两行说明HTTP代理服务器的IP地址为127.0.0.1,即回送地址,端口号为7890。

    • 这只是我在软件中设置的端口号,一定要根据实际情况填写自己的HTTP代理服务器的IP地址和端口号,自己软件的端口号不一定是7890,要是有专门的HTTP代理服务器,IP地址也不是回送地址,直接照抄我的设置是无法正常工作的。

  4. 此时如果有控制台处于开启状态,需要先将其关闭,在保证代理服务器配置完成并打开了HTTP代理的时候重新打开控制台,保证环境变量被正常加载。

  5. 使用Cmake预编译完成之后,一定要记得删除这两条环境变量,不然的话会影响其他应用的联网。

使用CMake预编译OpenCV的源码

  1. 进入之前下载好的OpenCV-4.3.0文件夹。

  2. 创建一个名为build的文件夹,用来存放预编译输出的内容。

  3. 进入build文件夹之后,点击左上角的“文件”菜单项,以管理员身份开启PowerShell。

  4. 输入命令cmake-gui,打开cmake-gui界面。

  5. 输入源码路径和要生成编译好的二进制文件的路径。

    源码路径是整个opencv-4.3.0文件夹,二进制文件路径是刚刚创建的build文件夹,下面以我的路径为例:

  6. 点击Configure,注意选择VS2019作为generator,之后,如果之前的HTTP代理服务器配置全部正常,这里的文件会全部下载成功,稍作等待,完成后会提示Configure done。

  7. 配置Contirb扩展模块的路径,这里只进行必须的两项设置,其他设置项读者可以根据需要自行设置或者到网上查阅相关资料。

    这里需要注意的是,不要选择任何跟CUDA有关的选项,除非你的VS之前可以编译、运行CUDA程序,不然的话,用VS编译OpenCV源码的过程中,会由于缺少文件导致编译错误。

    • 搜索extra关键词,配置Contirb扩展模块的路径,最后一级文件路径必须到modules,而不是opencv_contrib-4.3.0,这里以我的路径为例:

    • 搜索world关键词,并将该项选中,表示启用拓展模块。

  8. 点击Generate,如果之前的HTTP代理服务器配置正常,这里的文件会全部下载成功,无需手动下载。稍作等待,完成后会提示Generate done。

  9. 点击Open Project,预编译好的项目解决方案文件OpenCV.sln将被VS2019打开,等待整个项目加载完成。

使用VS2019编译OpenCV源码

  1. 配置解决方案平台,对应生成的编译好的OpenCV只能在当前选择的平台上运行,这里我选择的是配置为Debug模式、平台为x86-64。

  2. 按下组合键Ctrl + Alt + L,打开解决方案资源管理器。

  3. 找到当前解决方案下的CMakeTargets文件夹中的ALL_BUILD项目和INSTALL项目,不需要打开。

  4. 右键点击ALL_BUILD项目,选择重新生成,等待编译完成。(参考时间:i9 9900KF为五分钟,Jetson TX2共计四十分钟左右)

  5. 右键点击INSTALL项目,选择重新生成,等待编译完成。(参考时间:i9 9900KF为五分钟)

  6. 编译完成之后,就完成了OpenCV的源码编译安装。

配置VS2019的OpenCV开发环境

采用创建配置文件的方式配置开发环境, 新建工程之后不需要重复配置,直接导入配置文件即可。基本按照参考网站中给出的博客进行配置,有些地方稍作修改。

  1. 找到当前项目的属性管理器,如果没有这个侧边栏,需要在顶部菜单栏视图-其他窗口中打开

  2. 在x64 Debug下,创建一个新的配置文件,文件名称最好能够包含如下信息:

    1. 这是一个OpenCV的配置文件。
    2. 适用于机器字长为64位的计算机。
    3. 在VS的Debug模式下运行,而非Release模式。
  3. 双击打开创建的配置文件

  4. 配置通用属性->VC++目录下的包含目录,这里以我的路径为例:

  5. 配置通用属性->VC++目录下的库目录,这里以我的路径为例:

  6. 配置通用属性->链接器->输入下的附加依赖项,这里以我的路径为例:

    • 配置附加依赖项的时候,直接添加新的绝对路径即可,不要把库文件复制到VS的根目录下,然后只添加相对路径,配置OpenCV的过程本来就很头疼,没必要让步骤变得更加繁琐。
  7. 配置完之后,一定要右键单击刚才配置的文件,然后点击保存

测试程序

  • 注意默认生成的解决方案.sln文件和mian.cpp不在同一个路径下,使用相对路径时,要注意图片的路径!

    #include <opencv2/highgui.hpp>
    #include <iostream>
    
    using namespace cv;
    using namespace std;
    
    int main(int argc, char** argv) {
        Mat image;
        image = imread(samples::findFile("rubberwhale1.png"), IMREAD_ANYCOLOR);
    
        if (image.empty())                
        {
            cout << "Could not open or find the image" << std::endl;
            return -1;
        }
    
        namedWindow("Display window", WINDOW_AUTOSIZE); 
        imshow("Display window", image);                
        waitKey(0); 
        destroyAllWindows();
    
        return 0;
    }
    

如果你的图片能够正常显示,那么恭喜你!到此为止,所有的配置已经完成了!

附加

VC运行库版本、Visual Studio版本的对应关系

  • Visual Studio 6:vc6
  • Visual Studio 2003:vc7
  • Visual Studio 2005:vc8
  • Visual Studio 2008:vc9
  • Visual Studio 2010:vc10
  • Visual Studio 2012:vc11
  • Visual Studio 2013:vc12
  • Visual Studio 2015:vc14
  • Visual Studio 2017:vc15
  • Visual Studio 2019:vc16

VC运行库、OpenCV版本的对应关系

  • opencv 2.4.10:vc10、vc11、vc12
  • opencv 2.4.13:vc11、vc12
  • opencv 3.4.0:vc14、vc15
  • opencv 3.4.1:vc14、vc15
  • opencv 2.4.10:vc10、vc11、vc12
  • opencv 2.4.13:vc11、vc12
  • opencv 3.4.0:vc14、vc15
  • opencv 3.4.1:vc14、vc15

参考网站

原文地址:https://www.cnblogs.com/LYT-Dveloper/p/13517844.html