利用Cmake编译OpenCV源码

文章目录

  • 一、下载安装cmake
    • 1.下载
    • 2.安装
    • 3.检测安装是否成功
  • 二、使用cmake生成OpenCV源代码工程的解决方案(及添加opencv_contrib4.1)
    • 1.运行cmake,指定安装路径及cmake后的存放路径
    • 2. 使用cmake_gui的configure及generate配置OpenCV
      • 1)第一次configure
      • 2)第二次configure
      • 3)添加opencv_contrib,生成建构档,并generate
    • 3.使用vs2019打开建构项目,编译、安装
    • 4. 新建一个opencv项目,更新vs2019项目的属性文件,使用新编译的opecv库和扩展库contrib

简介:cmakes是生成跨平台工程的工具,比如可以为工程生成.sln文件在Visual Studio上打开,也可以生成.pro文件在QtCreator上打开。
日常用到OpenCV时,进行调用API时,选择定义时,只定义到头部文件.hpp,无法查看源码,因此在此利用cmake对OpenCV中的source文件进行编译成.sln解决方案

参考:OpenCV编程入门-2.2 开源的魅力:编译OpenCV源代码

一、下载安装cmake

CMake,是“crossplatform make”的缩写,它是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CmakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是CMake 和 SCons 等其他类似系统的区别之处

1.下载

下载地址:https://cmake.org/download/
打开后如图,点击红框内文件下载

利用Cmake编译OpenCV源码_第1张图片
.msi 文件是`window.installer`程序,双击就会是安装界面。 .tar.gz文件是linux 与MaxOs下常见的一种压缩文件。

2.安装

双击安装

利用Cmake编译OpenCV源码_第2张图片

添加环境变量

利用Cmake编译OpenCV源码_第3张图片

安装路径,修改为自己的

利用Cmake编译OpenCV源码_第4张图片

安装成功后进行,在使用前需要重启计算机(让添加环境变量生效)

利用Cmake编译OpenCV源码_第5张图片

3.检测安装是否成功

win+r 进入cmd 命令窗口 输入“cmake”显示出如下信息,则表明安装成功

利用Cmake编译OpenCV源码_第6张图片

二、使用cmake生成OpenCV源代码工程的解决方案(及添加opencv_contrib4.1)

1.运行cmake,指定安装路径及cmake后的存放路径

双击cmake_gui.exe运行在这里插入图片描述
显示的界面

利用Cmake编译OpenCV源码_第7张图片

其实我们可以发现,此指定安装路径下必须会有一个名为CMakeLists.txt的文件。

利用Cmake编译OpenCV源码_第8张图片

这个文件就是给cmake留下的配置文件,cmake可以根据这个配置文件,通过不同的编译器选择,来生成不同的解决方案,VisualStudio的编译器对应的就生成Visual Studio版的sln解决方案。
Ps:在此路径下切记不能出现中文,否则会出现一些不知名的错误

2. 使用cmake_gui的configure及generate配置OpenCV

1)第一次configure

如图,第一次点击Configure按钮:

利用Cmake编译OpenCV源码_第9张图片

会弹出如下进行编译器选择的对话框:

利用Cmake编译OpenCV源码_第10张图片

首先选定Use default native compilers,然后,我们可以发现下拉列表中提供了几十种编译器给我们选择,因为我们安装了Visual Studio,会默认为我们选择好对应版本的Visual Studio编译器,比如Visual Studio 19(即待会儿会生成对应VS2019的sln解决方案)

确认无误后,单击finish按钮。

于是,cmake开始第一次源代码配置过程:

利用Cmake编译OpenCV源码_第11张图片

出现错误,CMake Error: The following variables are used in this project, but they are set to NOTFOUND.,原因可能如下

  1. cmake版本与OpenCV版本冲突
  2. cmake版本与 vs2019冲突(很大可能)
  3. 使用的不是OpenCV官网上下载的source
    经验证,是第一条原因cmake版本与OpenCV版本冲突

因cmake版本是最新的,所以用OpenCV较新的版本4.1版本,改过后cmake中的设置:

利用Cmake编译OpenCV源码_第12张图片
有出错: 无法打开文件 "python36_d.lib"

解决: 是pyconfig,h 的配置问题,以 pyconfig.h (本电脑路径C:\Users\HASEE\AppData\Local\Programs\Python\Python36\include)为例,在第 338 行的语句:
pragma comment(lib,”python36_d.lib”)
对如下地方

利用Cmake编译OpenCV源码_第13张图片

在对应的 pyconfig.h 文件中做出如下修改:

利用Cmake编译OpenCV源码_第14张图片

并且要将 define Py_DEBUG(338 句)注销:

然后configure,就可以通过了!

参考:
无法打开 python36_d.lib 的问题
LNK1104 无法打开文件“python37_d.lib” 解决办法

2)第二次configure

一般两次configure就行了,直到没有红色,像第一次configure一样。

3)添加opencv_contrib,生成建构档,并generate

利用Cmake编译OpenCV源码_第15张图片
配置、生成:成功
利用Cmake编译OpenCV源码_第16张图片

3.使用vs2019打开建构项目,编译、安装

在cmake-gui完成Generate后,"Open Project"就由灰色变为可选了,右击就使用之前配置的vs2019来打开编译(可以根据需要编译,如编译Release和Debug版):

利用Cmake编译OpenCV源码_第17张图片

出错:error MSB307: 命令“setlocal
解决:
1、在打开的opencv.sln,分别在Debug X64 和release X64下直接生成解决方案
2、在CMakeTargets下的INSTALL右键选择生成;此时,在opencv4.1下面的newbuild中生成一个install文件夹,配置完毕。

4. 新建一个opencv项目,更新vs2019项目的属性文件,使用新编译的opecv库和扩展库contrib

新建c++空项目,添加并配置项目属性表(之后编译器也要在debug X64下运行 ):

利用Cmake编译OpenCV源码_第18张图片

添加包含目录:

利用Cmake编译OpenCV源码_第19张图片

添加库目录:

利用Cmake编译OpenCV源码_第20张图片

添加附加依赖项:

利用Cmake编译OpenCV源码_第21张图片

测试代码1(测试opencv):

#include 
#include 

using namespace std;
using namespace cv;

int main()
{
	String winname = "Image Window";
	//当前目录中添加一个名称为"color_wheel.jpg的图片文件"
	//指定图片来源和名称要和实际对应, 注意“/”
	Mat image = imread("F:/images/1.jpg");
	if (image.data == NULL)
	{
		cerr << "错误: 没找到文件。" << endl;
	}
	else
	{
		//指定图片显示器的标题名称
		imshow(winname, image);
	}
	//等待按键操作,避免闪退
	waitKey(0);
	return 0;
}

运行后出错,显示错误: 没找到文件
原因:配置“链接器->附加依赖项”时,把*.lib库一起加入其中,并且将.lib库加在了d.lib库之前,这样就导致了优先使用.lib。解决:是把附加依赖项中open的.lib全删了。
注意:一般在配置工程时,Debug工程的“链接器->附加依赖项”一般只加d.lib库;而Release工程的“链接器->附加依赖项”一般只加.lib库,这样就可以避免以上问题。

参考链接:
OpenCV imread读取图片失败解决方法
测试代码2(测试contrib):

#include 
#include 
#include 

using namespace std;
using namespace cv;
using namespace face;

int main()
{

    Ptr<FaceRecognizer> model;
	waitKey(0);
	return 0;
}

编译测试代码成功,则表示新opencv库和contrib库编译成功

opencv4.1.0,visual studio 2019,cmake 3.14.3配置
(win10 + vs2019) cmake编译 (opencv4.1.0 + opencv_contrib4.1.0)

你可能感兴趣的:(Cmake)