Windows下OpenCV开发环境配置与Visual Studio实际开发测试

Dec 1,2020   3740 words   14 min


0.背景

因项目需求,之前在Linux下写的C++代码需要转到Windows+Visual Studio的环境中来。而那个代码又依赖了OpenCV库,因此本篇博客主要记录在Windows环境下配置OpenCV开发环境并且利用Visual Studio 2010进行实际开发的测试。话不多说直接进入正题。

1.OpenCV的安装与配置(Windows)

(1) 下载OpenCV源码

在OpenCV官网找到Windows版本的对应源码下载。 下载完成后是一个exe可执行文件,双击打开,指定路径解压就可以得到源码了,十分简单。

(2) 系统环境变量设置

这一步就是常规操作了。我们找到刚刚解压的路径,比如我这里的是D:\OpenCV\build\x64\vc14\bin,把它添加到系统的Path变量中。 我们可以在cmd控制台中输入PATH命令查看当前路径。注意不能打开PowerShell,否则提示没有这个命令。

其实硬要说的话,这一步结束,OpenCV的安装就基本完成了。因为剩下的其实都是如何在项目中include各种路径、依赖以及其它相关问题。

下面的操作都是在64位的电脑上进行的,如果你的电脑是32位的话,则不在本篇博客讨论的范围之内了。

2.OpenCV的开发与使用(Visual Studio)

(1) VS解决方案创建

创建过程本身同样是常规操作,VS中选择Win32控制台应用程序,按提示下一步即可。

(2) 项目目标平台配置

这一步是使用OpenCV的基础,会决定是否能够顺利编译、运行。首先我们要明确一个概念,那就是对于VS编译的程序而言,分为Debug和Release两种模式,而针对运行平台又可以分为Win32和x64。因此排列组合一共有四种可能的情况。Debug-Win32、Debug-x64、Release-Win32、Release-x64。关于Debug和Release的区别,算是比较基础的内容,简单来说就是Release的程序比Debug运行效率更高,更多内容可以自行百度。接着说回上面的四种模式。这四种模式其实都对应了不同的依赖文件,因此需要分别处理。比如说Debug程序会依赖xxxxd.dll,而Release程序则会依赖xxxx.dll。这两个DLL文件并不能混用。在明确这个概念以后,前面说了,我们这里只介绍64位平台,也就是x64。而刚刚建立的默认的是Win32程序,因此首先需要修改目标平台。其实也十分简单,在VS上面的工具栏里找到“配置管理器”。 打开以后,在活动解决方案平台里选择“新建”。这时会弹出一个对话框。 我们在这里选择x64,点击确定即可。这样,我们就可以看到就修改完成了。 这里的是Debug-x64模式。而修改为Release就十分简单,不多说了。

(3) 项目的依赖配置

在明确了上面的模式(Debug)和目标平台(x64)以后,就可以对应导入相应的目录和文件了。在具体操作之前,还是先介绍一下基本概念。在之前使用CMake调用OpenCV的时候,一般都需要先包含目录,然后是链接文件。在VS中其实也是类似的。在使用OpenCV的时候,主要包括一系列的代码头文件等,它们一般位于include文件夹,另一个是各种库(library)文件,主要位于lib文件夹。因此我们在使用的时候需要配置这两个目录,一个是包含目录,另一个是库目录。具体而言,我们首先在“项目名称”上点击右键,注意是项目名称不是解决方案名称。然后选择“属性”。 在弹出的属性页中找到“VC++目录”,在右边可以看到有“包含目录”和“库目录”两个选项,我们要设置的就是它们。首先对于包含目录,我们找到刚刚解压好的路径,并添加如下内容: 完成后点击确定即可。而对于库目录,添加如下内容: 最后,还有一步操作,那就是添加Link时候的Lib文件名。这个文件在opencv\build\x64\vc14\lib文件夹里可以找到,如下。 如同上面提到的,以d结尾的表示对应Debug模式。这里我们是Debug,因此,我们在项目的属性页中找到“链接器”,再找到“输入”,在右边找到“附加依赖项”进行编辑,将对应文件名填进去,比如我们这里是opencv_world3412d.lib,如下。 另外需要强调的是,注意一下我们配置的是谁,是Debug的还是Release的,从左上角可以看到当前配置的是Debug模式。也就是说,对于Release,我们还是需要重新添加一下包含路径以及库文件。否则切换到Release模式下还是编译不通过的。

至此,我们可以简单写一段代码测试,不出意外的话,项目就可以顺利生成、编译了。比如,你可以把下面这段代码贴过来,正常情况下是编译通过的。

// OpenCVDemo.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include<opencv2\opencv.hpp>

using namespace cv;

int _tmain(int argc, _TCHAR* argv[])
{
	Mat m(600, 600, CV_8U);
    RNG rng;
    int row = m.rows;
    int col = m.cols * m.channels();
    for (int i = 0; i < row; ++i) {
        char *data = m.ptr<char>(i);
        for (int j = 0; j < col; ++j) {
            data[j] = int(rng.uniform(0, 255));
        }
    }
	imshow("random",m);
	waitKey(0);
	return 0;
}

这段代码是生成一个600×600的8bit灰度影像,然后遍历每个像素,随机赋一个灰度值给它,并最后展示出来。不用纠结main函数为什么是这个写法,参数是什么意思,stdafx.h又是什么,这些都是VS新建项目时自动生成的。

顺带说一下,这一步其实也就是让很多VS工程变得非常复杂,各种找不到文件的主要原因。尤其是别人给你一个很多文件的工程的时候。上面提到的包含路径,其实最好的方法是写成相对路径,而不是写死。这样的好处就是你只要保证依赖文件和可执行文件的相对路径不变,即使把它们都拷到别的电脑上,系统也能找到。而不会出现找不到各种依赖而报错的情况。

3.OpenCV程序的运行与测试

(1) 运行时依赖配置

如果你前面编译通过了,直接运行的话可能会遇到各种DLL找不到的情况,concrt140d.dllmsvcp140d.dllucrtbased.dllvcruntime140d.dllopencv_world3412.dllopencv_world3412d.dllopencv_ffmpeg3412_64.dll如下。 不用惊慌,这不是你程序的问题。只是单纯没有在当前系统中找到对应文件而已。解决的办法也非常简单,那就是拷贝相应文件即可。你可以在这篇博客的第10步中找到前四个文件的下载链接。而后面三个,你可以直接在解压的OpenCVD:\OpenCV\build\x64\vc14\bin文件夹中找到。此时,你有两种选择,一种是像那篇博客一样,直接放到C:\Windows\System32下面,另一种是放到你生成的exe文件夹下。具体哪一种取决于你的应用场景。如果说是你自己的电脑,为了配置环境,以及以后使用的方便,你可以把这些文件拷贝到系统路径下,如果说你的项目需要在别人的电脑上运行,而且也不让你修改别人的环境,那么建议和你的exe文件放一起,这样携带方便。比如我这里,从携带方便的角度,把它们和可执行文件放一起,如下。 甚至,你也有第三种选择,就是把这些DLL放在其它地方,然后设置一下系统变量Path,让系统能够找到这些DLL,当然也是可以的。

(2) 运行测试

至此,你终于可以点击运行的小三角了。程序正常运行的效果如下所示。 OpenCV+Windows+Visual Studio的配置与使用也就到这里了。

4.实际应用场景探讨

对于OpenCV的实际应用场景,更多的可能是你写好了代码,然后放到别人的电脑上去使用。对方电脑可能没有OpenCV环境,或者有但是版本不一致。你在对方电脑上一编译,各种问题,运行不了。而且对方电脑可能也不允许你修改他们的配置。这种情况最好的解决方式就是把OpenCV库和你的程序放到一起带着,在项目依赖里以相对路径写,这样可以最大限度保证程序的可用性。作为开发者实际在开发的时候,也可以按照上面的步骤“反向”操作,把自己电脑上的OpenCV环境“删掉”,模拟没有OpenCV的电脑再进行测试。

5.参考资料

  • [1] https://blog.csdn.net/bmjhappy/article/details/93068644

本文作者原创,未经许可不得转载,谢谢配合

返回顶部