欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Win7x64+VS2013+opencv-3.1.0+cmake-3.11.0-win64-x64+重编译OpenCV

程序员文章站 2022-07-09 15:28:21
...

参考Win7x64+VS2012+OpenCV2.4.3+CMake2.8.10+TBB41重编译OpenCV博客

如果需要额外配置扩展模块

重编译的好处:可以调试的时候看OpenCV的源代码。

重编译要得到的东西:Debug版本和Release版本的dll,lib,头文件。(dll添加到环境变量里,运行时用,自己编译的dll调试时可以跟踪到Opencv的源码内;lib和头文件配置到编译器里)

PS:如果只是使用Opencv而不需要跟踪源码,则使用Opencv自带的库文件即可。跳到5配置Opencv开发环境,对应的文件都在..\opencv\build\目录下,其中dll(bin目录),lib目录在平台文件夹下如..\opencv\build\ x86\vc10。

本机Win7 64位系统,装有VS2013,以编译64位的Opencv库为例,要编译64位库需要注意选择64位的配置。

这里需要选择合适的编译器,由于我用的是64位的系统,所以我选择如上的编译器。当然如果我们配置OpenCV时只需要使用到32位的,也可以选在Viusal Studio 10,完成选择后点击Finish。

1下载安装cmake运行cmake-gui

2指定OpenCV的安装路径

3指定解决方案的存放路径

4第一次Configure

5第二次Configure

6点击Generate大功告成

7添加新项目属性表

首先,要用cmake编译一下OpenCV;然后,就是修改源码了;接着,配置新生成的dll和lib;最后,测试。

1、下载安装cmake

想要在Windows平台下生成OpenCV的解决方案,我们需要一个名为cmake的开源软件,可以在camke的官网:http://www.cmake.org/上下载到,首先转到其下载页面。

而Binary distributions处可以下载到cmake的执行文件,我们只需要下载到其执行文件即可,选择Windows (Win32 Installer)进行下载,点击这里直接下载:

http://www.cmake.org/files/v2.8/cmake-2.8.12.2-win32-x86.exe这一步就是下载和安装cmake,下载地址给出了,安装大家都会,就不过多讲。安装完成后,如果没有生成桌面快捷方式,在安装路径下,如D:\Program Files(x86)\CMake 2.8\bin处找到cmake-gui.exe运行。(或者直接下载压缩包文件,不用安装直接运行里面的cmake-gui.exe)

如果是64位系统,下载cmake-3.11.0-win64-x64.zip ,但是注意opencv-3.1.0软件,添加路径直到source

Win7x64+VS2013+opencv-3.1.0+cmake-3.11.0-win64-x64+重编译OpenCV

 2、使用cmake生成OpenCV源代码工程的解决方案

<1>运行cmake-gui

Win7x64+VS2013+opencv-3.1.0+cmake-3.11.0-win64-x64+重编译OpenCV

<2>指定OpenCV的安装路径

如下图,点击红色方框内的“Browse Source”按钮,在弹出的对话框中指定出OpenCV安装时源代码的存储路径。以当前最新版本的OpenCV 2.4.8安装在D:\Program Files下为例,则在此选择路径:D:\Program Files\opencv\sources其实我们可以发现,此路径下必须会有一个名为CMakeLists.txt的文件。

Win7x64+VS2013+opencv-3.1.0+cmake-3.11.0-win64-x64+重编译OpenCV

这个文件就是给cmake留下的配置文件,cmake可以根据这个配置文件,通过不同的编译器选择,来生成不同的解决方案,VisualStudio的编译器对应的就生成Visual Studio版的sln解决方案。

<3>指定解决方案的存放路径

点击红色方框内的“Browse Build”按钮,在弹出的对话框中指定我们存放生成的opencv解决方案的路径。比如F:/opencv。

<4>第一次Configure

第一次点击Configure按钮。会弹出编译器选择的对话框;首先选定“Use default native compilers”,然后,我们可以发现下拉列表中提供了几十种编译器给我们选择,因为我们安装了Visual Studio,会默认为我们选择好对应版本的Visual Studio编译器,比如Visual Studio 10(即待会儿会生成对应VS2010的sln解决方案)

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

<5>第二次Configure

第一次配置完成之后,我们还需要进行第二次配置,于是再次点击“Configure”按钮。这次的配置是很快的,几秒钟就会再次出现“Configuring done”字样,并且红色的选中部分都正常了。

<6>点击Generate,大功告成

这样,就只剩下点一次Generate按钮,来生成最终的解决方案了。因为之前已经有过两次的configure过程,所以生成解决方案也将是非常的快。看到Generating done字样,就表示大功告成,可以去之前我们指定的F:\opencv下找寻我们生成的解决方案了。

PS:自从2.4.7版本起,opencv源代码就直接包含在了opencv的安装路径下,我们生成的sln工程,也只是连接到了opencv安装路径下的源文件而已,工程本身并不大。

 3、编译OpenCV源代码

      (1)打开刚刚生成的热乎乎的“OpenCV.sln”解决方案,看到一个庞大的工程映入眼帘——这可是一个包含了68个项目的解决方案:

Win7x64+VS2013+opencv-3.1.0+cmake-3.11.0-win64-x64+重编译OpenCV

这里小心,如果你是64位的,得在x64位下进行编译

 2在解决方案资源管理器里面右键ALL_BUILD(这个必须生成,否则会造成无法更新源代码或者从程序中进入不了源代码)点击生成;生成完成后再右键INSTALL,点击生成

debug状态下右击图中的INSTALL,点击生成。然后点击debug的开始按钮。

 然后在release下也进行一遍。

 2)编译OpenCV,就是得到了一些二进制的生成文件,如DLLLibexe。位于install目录下。该目录下的文件很重要。

Win7x64+VS2013+opencv-3.1.0+cmake-3.11.0-win64-x64+重编译OpenCV

 3)进入install目录后有很多文件。下面简要说明:

A、include目录:头文件

B、x64目录:而在lib目录下则是生成的各个模块的lib。Lib只是Dll的附带品,是DLL导出的函数列表文件而已

 4、配置OpenCV编译环境

环境变量path应该添加以下两个路径:

D:… \install\x64\vc12\bin.dll文件都在这里)是用CMake生成的VS2010工程的所在目录。

说明:之前用的是OpenCV自带编译版本的请注意了,应该将原来环境变量删除后再添加。一开始没有删除导致后面一直调试不成功,即使能跟踪源代码了,但是只要函数形参是const string& 的函数,字符串就无法正常传递,调试时发现函数形参一直是<错误的指针>,无法赋值。具体原因不太懂。

   5、新建OpenCV工程

1、打开VS2013,新建控制台应用程序TestOpencv。

2、配置包含目录和库目录

添加新项目属性表

Win7x64+VS2013+opencv-3.1.0+cmake-3.11.0-win64-x64+重编译OpenCV

右击——属性->VC++目录->包含目录,添加

D: myopencv \install\include 

D: myopencv\ install\include\opencv2

D:myopencv\install\include\opencv                                                                 

属性->VC++目录->库目录,添加D:… install\x86\vc10\lib

注意:这些目录都是cmake生成的。(release下同样)

release下还应进行以下配置,选择多线程DLL/MD),否则运行会出错。

Win7x64+VS2013+opencv-3.1.0+cmake-3.11.0-win64-x64+重编译OpenCV

3、添加附加依赖项

链接器->输入->附加依赖项处添加:

文件在D:myopencv/lib/debug(release)下面

【注】  要将debugrelease下的lib分开添加,不然会出现imread无法读取数据的问题

对于配置方案为Debug的配置,添加:

opencv_calib3d310d.lib
opencv_core310d.lib
opencv_features2d310d.lib
opencv_flann310d.lib
opencv_highgui310d.lib
opencv_imgcodecs310d.lib
opencv_imgproc310d.lib
opencv_ml310d.lib
opencv_objdetect310d.lib
opencv_photo310d.lib
opencv_shape310d.lib
opencv_stitching310d.lib
opencv_superres310d.lib
opencv_ts310d.lib
opencv_videoio310d.lib
opencv_videostab310d.lib

对于Release配置,添加



opencv_calib3d310.lib
opencv_core310.lib
opencv_features2d310.lib
opencv_flann310.lib
opencv_highgui310.lib
opencv_imgcodecs310.lib
opencv_imgproc310.lib
opencv_ml310.lib
opencv_objdetect310.lib
opencv_photo310.lib
opencv_shape310.lib
opencv_stitching310.lib
opencv_superres310.lib
opencv_ts310.lib
opencv_videoio310.lib
opencv_videostab310.lib

二、修改源码

1、比如我想修改imshow()函数,使其显示图像的同时输出我们自己加的tfygg modify 这句话。我们找opencv_highgui模块中的window.cpp文件的257行,并修改为:

[cpp] view plain copy

void cv::imshow( const string& winname, InputArray _img )  

{  

    std::cout<<"-----------------------------------华丽分隔符----------------------------------"<<std::endl;  

    std::cout<<"tfygg modify!"<<std::endl;  

    std::cout<<"-----------------------------------华丽分隔符----------------------------------"<<std::endl;  

    const Size size = _img.size();  

...  

}  

然后,加上头文件 #include<iostream>

修改完,重新debug状态下右击图中的INSTALL,点击生成。然后点击debug的开始按钮。否则无法更新库中文件,你会发现改不了源程序

  添加测试代码

修改TestOpencv.cpp,代码为:

#include <opencv2\opencv.hpp>

using namespace cv;
using namespace std;
int main()
{
	Mat img = imread("c:/pp.jpg");
	if(img.empty())
	{
		cout<<"error";
		return -1;
	}
	imshow("pp的靓照",img);
	waitKey();

	return 0;
}

将要显示的图片保存为c:/pp.jpg编译运行,显示出图片。

Win7x64+VS2013+opencv-3.1.0+cmake-3.11.0-win64-x64+重编译OpenCV


通过设置断点发现,能够跟踪进入Opencv内部函数

Win7x64+VS2013+opencv-3.1.0+cmake-3.11.0-win64-x64+重编译OpenCV

但是,有时候,会发现有些项目,还是得用以前的配置,可以采用,需要学习时候,通过修改路径来达成目的,花了我一晚上才只能这么妥协掉

通过Cmake系统环境变量   D:\myopencv\stall\x64\vc12\bin;C:\Program Files (x86)\Windows Kits\8.0\bin\x64;

原来的系统环境变量(不能是用户环境变量)

 D:\opencv\build\x64\vc12\bin;D:\opencv\build\x64\vc14\bin;C:\Program Files (x86)\Windows Kits\8.0\bin\x64;