opencv 源码编译+环境配置+项目配置+项目练习+出现的问题及解决方案

目录

0  引言

1  opencv 是什么?

2  相关环境

3 下载好CMake之后配置源码

3.1 解压

3.2 创建cmake输出目录 

3.3 使用cmake 构建项目 

4 vs 编译opencv源码

5  VS使用opencv

5.1   将本地路径下的openCV文件引入到项目中

5.2  将在VS项目中创建opencv文件夹,将需要的库文件放到VS中

6  项目练习

 7  出现的问题及解决方案


0  引言

首先我的学习基于前辈的总结和自己的理解学习。

首先引入我所学习的几位前辈的文章拜阳前辈文章Chris_zhangrx前辈的文章_helen_520前辈的文章

好了话不多说,我也是为了巩固今日所学,希望能够提升自己也能帮助到想要学习opencv的各位。

1  opencv 是什么?

OpenCV的全称是:Open Source Computer Vision Library

OpenCV是Intel开源计算机视觉库。它由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法。开源自然是其优点之一,但是OpenCV是基于c语言开发的,开发周期长,编程复杂。不过我们只需要知道openCV是计算机视觉库就可以了,简单是来说就是计算机图像处理。广泛应用于物体识别,图像分割,人脸识别等领域。

2  相关环境

opencv源码下载官网:https://opencv.org/

CMake下载官网:https://cmake.org/

cmake 安装步骤如下

勾选中间的选项让程序自己配置环境变量,下面的桌面图标自己选择。

接下来的安装基本就是next,安装完成后cmd 输入cmake 出现以下内容表示成功

相应的vs版本:这里我以vs2019为例,各位也可以去找新版本或者旧版本

https://learn.microsoft.com/en-us/visualstudio/releases/2019/release-notes 这是老版本vs连接

3 下载好CMake之后配置源码

3.1 解压

解压各位下好的opencv压缩包,我下载的是opencv-4.7.0.zip,配置过程大同小异。解压之后文件夹里还有三个压缩包,也需要全部解压。

3.2 创建cmake输出目录 

cmake构建源码生成的结果需要输出到指定文件夹中方便我们使用。所以为了方便,直接在opencv-4.7.0目录中创建一个build文件夹,文件名可以自己取。

3.3 使用cmake 构建项目 

 1 打开下载好的cmake-gui(应该在C:\CMake\bin目录下,根据个人路径寻找,也可以在下载的时候勾选桌面图标)

以下就是内容填充,分别是解压的源码目录和自己新建的输出目录

 2  点击下方configure 进行配置,可以选择自己的vs版本,但是要注意版本匹配问题。,这里我是4.7.0 选择VS019版本,具体版本信息可以上网查查一下。

(153条消息) OpenCV与VS的版本对应关系_opencv对应vs版本_David_djw的博客-CSDN博客

 静等构建,可能需要两三分钟,也可能是五六分钟。

 3  如果各位按步骤做,大概率会有以下的问题,不过都是正常的。

我想各位大概率应该和我一样会出现库文件缺失的问题

 这是个莫名其妙的问题,明明是从官网下载的opencv源码,在源文件中也能找到对应的库文件,为什么不能构建成功呢。不说了,理不清,直接解决吧。

打开各位的build 输出文件夹,在里面可以查看下载日志。

 打开查看日志信息。找到里面所有的do_copy字样的段落进行文件下载替换。

例如在上图中 缺失opencv_videoio_ffmpeg.dll 库文件,要到后面提到的官网进行下载,然后将下载好的库文件放到对应的文件夹中。这里要注意有的库文件能直接下载,有的是文本要另存为指定的文件名,也要注意后缀问题。可能大家发现对应的文件中有这些库文件,可是大家还是要替换掉,然后发现问题解决。还有更神奇的,多次点击configure发现 红色没了。。。不过这种方式大概率是不行的。还是需要到指定的地址去下载然后替换掉指定地址的文件。这里还是有个问题,就是我的笔记本连接wifi 到指定的网站下载文件就流量很慢,然后自己提示网络问题,下载失败了,开热点的话连网站都不显示。唉,难弄。

4 这里构建成功后,建议取消TEST 和CUDA 选项 勾选BUILD_opencv_world选项,这样会自动生成opencv_*world.lib,方便调试

 

5 添加 opencv_contrib的路径

 

6  继续configure  然后generate 最后在build路径下生成opencv.sln

4 vs 编译opencv源码

1 找到 build 路径下生成的 opencv.sln 打开

 2 在DeBug模式下依次点击生成->解决方案 ,这个过程大概需要5-10分钟,甚至更久。

3 找到右侧的项目中的CMakeTargets 右击INSTALL然后点击生成,

build\install\x64\vc16\bin   存放的是dll库文件

build\install\x64\vc16\lib   存放的是lib库文件

build\install\include         存放所有OpenCV2图像处理头文件

其实install文件中的所有库文件都在build文件的夹里分散开存放,而install文件就是将所有零散的库文件收集起来存在一起方便使用。比如DeBug模式下生成的dll文件存放在build/bin/DeBug目录下,相对的 Release模式下的生成的库文件在build/bin/Release目录下。二者之间的区别就是Debug生成的文件在后缀名之前多一个字母d。并且Debug模式是开发者调试模式,Release是在用户的角度进行调试。前者调试过程更慢写,内容更多。具体可以上网查询。

4 换成Release模式重复上述步骤。

 上图是编译成功的显示界面。

5  VS使用opencv

总体来说VS使用opencv有三种方式。

第一种是将本地路径下的opencv引入到项目中。

第二种是将在VS项目中创建opencv文件夹,将需要的库文件放到VS中

第三种方式是命令行的方式,本文不讲这种方式,感兴趣的同志可以去网上查阅

以下两个小节讲解这两种方法

5.1   将本地路径下的openCV文件引入到项目中

 1 右击项目找到属性 

 2  VC++目录->包含目录->编辑

 3  把头文件位置 告诉VS工程 

 上图需要注意的是有的opencv版本有多个头文件文件夹,都需要加入父子级目录

  例如  opencv\include

            opencv\include\opencv

            opencv\include\opencv2

4  加入库文件目录,这里的目录根据自己的opencv lib目录而定

 

5  添加依赖项

 

 这里的依赖项是依据模式而定,如果是Debug模式就需要将lib库里的 ***d.lib加入进去,如果是Release模式就需要将**.lib加入进去。尽量避免两种lib全部加进去,很有可能会出现link错误。

可能有同志会问为什么我明明告诉了项目库的地址,为什么还要加入依赖。这个我也不是很清楚,但是我知道,如果没有依赖项就会导致LINK1104或者其他LINK编译错误。明显是没有链接依赖项导致的。

配置完以上内容,opencv就可以工作了。

5.2  将在VS项目中创建opencv文件夹,将需要的库文件放到VS中

1  首先创建一个新的工程,然后在工程文件夹下新建一个文件叫叫opencv,并在这个文件夹中创建bin文件夹和lib文件夹。

2  将之前源码编译过程中的build/install的include 复制到opencv文件夹下,再将build\install\x64\vc16\bin的所有的文件复制到opencv/bin目录下,将build\install\x64\vc16\lib所有的文件放到opencv/lib目录下。

3  接着按照第一种方式添加头文件,库和依赖,只不过位置变成了相对地址。

  将环境改为项目本地 编辑内容为PATH=..\opencv\bin ,这一步我看其他前辈做了,但是我没做也能成功。要注意两点,第一点路径为反斜杠,下图中的是错误的写法。第二点,如果这一步配置了出错了,那么就需要新建项目并且不做这一步。直接做下一步。

 然后配置头文件和库 都是  ..\opencv 开头的(最好是放在在项目上一级目录,如果不知道项目在哪,可以在VS中右击项目找到下方的在文件资源管理器器中打开,退回上一级,粘贴opencv) 也就是本项目中的opencv路径下,这里的路径也需要是反斜杠。

 链接器中输入的内容与第一种方式相同,这里我再次强调,一定要看编译的时候是X86还是X64。

6  项目练习

这理我选择边缘检测作为项目练习,其他的腐蚀效果,阴影效果啥的都可以。

#include <opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp> //highgui模块头文件
#include<opencv2/imgproc/imgproc.hpp>//图像处理头文件
using namespace cv;
int main()
{
    Mat srcImage = imread("1.jpg"); //读取原图,并将原图信息存放在变量中
    imshow("【边缘检测原图】", srcImage);//在控制台上显示原图
    
    Mat edge, grayImage; //声明两个变量分别进行 边缘检测处理 和  灰度处理

    cvtColor(srcImage, grayImage, COLOR_BGR2GRAY);//尤其是第三个参数,不懂别改
    
    blur(grayImage, edge, Size(3, 3)); //进行图像内核降噪,就是提高视觉效果
    Canny(edge, edge, 3, 9, 3);  //进行边缘检测操作

    imshow("【边缘检测效果图】", edge);
    waitKey(0);//毫秒级时钟函数,参数为0就是等待任意键结束
    destroyAllWindows();  //这个函数是关闭所有的窗口,如果没有这个操作会出现程序异常
    return 0;
}

以下是成果图

 7  出现的问题及解决方案

    1  第一个问题就是Cmake的时候出现的一片红,各位千万要按照CMakeDownloadLog.txt中的解决方案到指定的网站下载再放到指定的文件夹中,虽然源文件中有,但是肯定是内容不全的。也不要多次configure ,虽然会rag红框消失,但是问题就是问题,并没有解决。

    2  注意运行自己新建的项目的时候是X86 还是X64,我们下的opencv版本都是针对特定的windows和VS版本的,如果没注意,可能导致明明告诉了项目头文件的地址,可是它就是找不到,这个问题让我找了几个小时。还有同志可能会问为什么不设置一个系统环境变量,将opencv的bin文件放到环境变量中,我也想啊,可是我放进去不生效,我也不知道为什么,下面就是我的环境变量配置,也希望同志们能帮助我找到问题所在。

 

  3  0x00007FFCC57949B9 处(位于 test.exe 中)有未经处理的异常: Microsoft C++ 异常: cv::Exception,位于内存位置 。  没错上面一整句话是一个问题。这个问题出现在函数的参数不对。有可能我们的编译器在我们编写代码的时候给我们提示,我们抱着尝试的心理或者没注意就使用了那些宏,而导致我们的程序出错,很简单,出现此类问题,什么内存问题,基本都是代码有问题,对于自己陌生的参数多找找问题所在。

 4 error LINK 1104 : 出现这个问题大概率就是依赖项没写对,检查检查。

5 VS编译的时候出现找不到dll,无法执行代码的情况,如下图所示

解决方案一:

这种情况是没有配置环境变量导致的。网上下载的opencv源码 经过VS生成解决方案和右击INSTALL点击生成后的 bin目录 应该在 G:\opencv4.7\opencv-4.7.0\build\install\x64\vc16\bin(举例)

这种目录上。当然你也可以复制出来 到一个新的opencv路径上 将bin目录的绝对路径添加在环境变量Path中即可解决问题。

解决方案二: 与配置环境变量的方法类似,直接将对应的dll文件复制到C:\Windows\System32目录下,因为这个目录是在环境变量里的,添加到这个目录跟第一种方法结果相同。

  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值