原文地址:https://anoyer.cn/index.php/archives/75/
前言
疫情带来的“漫长假期”和由于国外疫情的过于严重,导致下半年ICPC区域赛依旧遥遥无期,我最终还是打算为以后找一份好工作做一些准备。因为比较希望可以找一份和图形处理有关的工作,所以趁着现在摸鱼的大好时光,想入手学习一波计算机视觉的我,开始了在OpenCV上的掉头发之路X_X。
通过一些论坛贴吧及B乎大佬了解到一些比较好的入坑书籍吧,最终选择了较为系统800页大书《学习OpenCV3》。22号从狗东入手的这本书,24号上午书便到了,一到手第一件事便是翻看目录(个人比较习惯这样,可以了解到通过本书可以学习到哪些东西)。书和其他书籍一样前面一堆前言,快速看了一遍后,遍来到了入坑预备工作—OpenCV3配置环境。
因为书上环境配置介绍的过于简单(可能是因为我太菜了QAQ)和我在配置中遇到的各种问题,所以我觉得写下这篇文章,对我配置的过程及问题做一个记录,方便日后查看。
下载和安装OpenCV3
在http://opencv.org/downloads.html,可以发现最新的为Windows准备的最新版本OpenCV下载链接。可以通过这个链接下载一个为EXE的文件,该文件会把预编译好的OpenCV解压到你的电脑上,预编译版本支持不同的版本的Visual Studio环境。现在,你很快就可以开始使用OpenCV了。
上面内容摘自《学习OpenCV3》第10页第一段话,事实到这里你才刚刚开始掉入环境配置的坑中。
因为这本书是几年前出版的了,现在http://opencv.org/downloads.html链接已经无法访问了,改为:https://docs.opencv.org/。不仅如此官网下载速度也出奇的慢,所以建议到OpenCV国内快速下载中下载相应版本。我下载的是opencv-3.4.1-vc14_vc15.exe
,为啥不下载3.4.10?别问?问就是眼花少看了个0。
下载好后,找一个合适的盘安装就可以了,我安装在了D盘。
环境配置及关联Visual Studio项目
在我们OpenCV3安装路径下有两个文件夹,源代码文件source
及编译好的OpenCV的环境文件build
。在Build\x64
中会有文件夹vc14
和vc15
,分别对应的是Visual Studio 2015和Visual Studio 2017的用的OpenCV3版本。如果你这个时候你和我一样用的是Visual Studio 2013或者更低版本的Visual Studio,那么你便需要使用CMake手动编译OpenCV的源代码生成符合自己Visual Studio的环境了,详细步骤见OpenCV3编译。
下面环境配置实例Visual Studio版本号为为2013,所以我将使用的是vc12
,具体根据自己VS版本而定。
添加环境变量
首先我们需要将vc12\bin
添加到系统环境变量path中,这里我使用的是自己编译vc12,路径为opencv_vs2013_x64\install\x64\vc12\bin
。
创建新的项目,配置OpenCV3.4.1
1、配置项目属性页中VC++目录的包含目录及库目录
(1)包含目录
D:\OpenCV3.4.1\opencv_vs2013_x64\install\include
D:\OpenCV3.4.1\opencv_vs2013_x64\install\include\opencv
D:\OpenCV3.4.1\opencv_vs2013_x64\install\include\opencv2
(2)库目录
D:\OpenCV3.4.1\opencv_vs2013_x64\install\x64\vc12\lib
(3)附加依赖项
Debug模式附加依赖项
注意每个lib文件末尾341d表示的是3.4.1版本的Debug模式,所以341根据自己安装的OpenCV版本号进行修改
opencv_calib3d341d.lib
opencv_core341d.lib
opencv_dnn341d.lib
opencv_features2d341d.lib
opencv_flann341d.lib
opencv_highgui341d.lib
opencv_imgcodecs341d.lib
opencv_imgproc341d.lib
opencv_ml341d.lib
opencv_objdetect341d.lib
opencv_photo341d.lib
opencv_shape341d.lib
opencv_stitching341d.lib
opencv_superres341d.lib
opencv_video341d.lib
opencv_videoio341d.lib
opencv_videostab341d.lib
Release模式附加依赖项
opencv_calib3d341.lib
opencv_core341.lib
opencv_dnn341.lib
opencv_features2d341.lib
opencv_flann341.lib
opencv_highgui341.lib
opencv_imgcodecs341.lib
opencv_imgproc341.lib
opencv_ml341.lib
opencv_objdetect341.lib
opencv_photo341.lib
opencv_shape341.lib
opencv_stitching341.lib
opencv_superres341.lib
opencv_video341.lib
opencv_videoio341.lib
opencv_videostab341.lib
项目环境平台修改为X64平台
因为默认建的项目实win32,但是这里我生成的是x64的环境,所以需要在项目属性页将平台选为X64。若无此选项,则点击配置管理器,选择X64平台,若无则新建一个X64平台并选中。
开始你第一个OpenCV程序
#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace std;
int main(int argc,char **argv)
{
cv::Mat image = cv::imread("C:/Users/Administrator/Desktop/tqzz.jpg");
cv::namedWindow("天气之子", CV_WINDOW_FREERATIO);
cv::imshow("天气之子", image);
cv::waitKey(0);
return 0;
}
如果项目运行时出现“无法启动此程序,因为计算机中丢失opencv_cored341.dll”等类似错误提醒,是因为你配置的环境变量,没有生效,重启电脑后,再次运行程序就不会出现这个问题了。
OpenCV3编译
工具:CMake
编译步骤
首先下载CMake并解压,然后我们在OpenCV目录下面新建一个名为opencv_vs2013_x64
文件夹。运行CMake文件目录里bin文件下的cmake-gui.exe
文件。
第一个选择栏选中前面说的OpenCV源代码文件夹,第二个选择栏选择刚刚新建的opencv_vs2013_x64
。
点击软件界面左下角的Configure
,会出现下述界面。选择你所需要的编译器和解决方案版本。这里我们用的是vs2013,其中“Visual Studio 12 2013”指编译成32位的,“Visual Studio 12 2013 Win64”指编译成64位的,根据需要而选择。选择后点击“Finish”,开始下载相应函数库,此过程需要等好长一段时间。
第一次Configure完成后,会出现红色部分。这是为了让用户可以手动补充相应函数库,如TBB、CUDA、Eigen等,这里视你的需求而定,若需要其他库,请自行下载相应库,并自行配置库的include和lib。如果无需CUDA版本,可将WITH_CUDA的选项取消。然后再一次Configure(一般共需要两次Configure),等待一会,就会看到configuring done信息提示,表示配置成功。
点击Generate
,生成OpenCV源代码的Visual Studio解决方案。当出现Generating done的提示,即表明解决方案生成成功。
最后点击Open Project
,打开解决方案。
到这里已经完成第一步了,下面只需按下面步骤进行编译便可以得到vc12
文件及相应函数库。
解决方案完全打开后(注意VS下面读条),先将解决方案修改为Debug模式,然后右击All_BUILD,选择生成(此过程需要一段时间)。生成成功后,右击INSTALL,选择生成,生成成功后,会在“opencv_vs2013_x64”目录中生成“install”目录,里面就是我们所需要的,同时opencv_vs2013_x64
文件夹下的其他文件都可以删除了,保留install
便可以。
编译遇到的问题
在编译过程中能会出现以下错误:
源代码报错:char *不能接受const char *
可以定位到报错的代码语句,在const char*
前面套上const_cast(char*)(...)
,将const char*
强转为char*
。
这个错误我第一次编译便遇到了,因为当时没有截图,所以没有图片。
无法打开python27.lib或python37.lib类错误
造成该类错误的原因是因为编译opencv_python2
或者opencv_python3
是他不知道去哪里找python27.lib
和python37.lib
(不一定是27和37,对应的是你电脑中python版本号)。
解决方案便是对opencv_python2
或者opencv_python3
右键选择属性,然后在VC++目录
中的库目录里选择编辑加上对应的python的libs文件夹路径
加完重新编译,你就会发现错误消失了。
无法打开python27_d.lib或python37_d.lib类错误
产生这类错误的原因是因为我们一般下载的python是release版的,会缺少python27_d.lib
和python27_d.dll
文件。怎么办呢?我们可以自己伪造一个缺失的文件,操作如下:(这里拿python27举例)
将python27.dll
和python27.lib
都拷贝一份并重命名为python27_d.lib
和python27_d.dll
。
然后在修改python安装路径\include
下的 pyconfig.h
, object.h
。
- 修改pyconfig.h
找到下面代码段
#ifdef _DEBUG
# define Py_DEBUG
#endif
将其修改为:
#ifdef _DEBUG
//# define Py_DEBUG
#endif
找到下面代码段
# ifdef _DEBUG
# pragma comment(lib,"python27_d.lib")
# else
# pragma comment(lib,"python27.lib")
# endif /* _DEBUG */
将其修改为:
# ifdef _DEBUG
# pragma comment(lib,"python27.lib")
# else
# pragma comment(lib,"python27.lib")
# endif /* _DEBUG */
- 修改object.h
找到下面代码段
#if defined(Py_DEBUG) && !defined(Py_TRACE_REFS)
#define Py_TRACE_REFS
#endif
修改为:
#if defined(Py_DEBUG) && !defined(Py_TRACE_REFS)
// #define Py_TRACE_REFS
#endif