本系列文章由@浅墨_毛星云 出品,转载请注明出处。
文章链接: http://blog.csdn.net/poem_qianmo/article/details/21974023
作者:毛星云(浅墨) 邮箱: happylifemxy@163.com
写作当前博文时配套使用的OpenCV版本: 2.4.8
这篇文章中,我们一起探讨了如何通过已经安装的OpenCV,选择不同的编译器类型,生成高度还原的OpenCV开发时的解决方案工程文件,欣赏OpenCV新版本中总计 六十六多万行的精妙源代码。我们可以对其源代码进行再次编译,得到二进制文件,或者修改原版官方的OpenCV代码,并编译后为自己所用,为深入理解OpenCV的开源魅力迈出了坚实的一步。
一、下载安装cmake
想要在Windows平台下生成OpenCV的解决方案,我们需要一个名为cmake的开源软件,可以在
camke的官网:http://www.cmake.org/上下载到,首先转到其下载页面。下载页面的Source distributions处可以下载到cmake软件的源码,如果对这款开源软件感兴趣,不妨看看。
而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的一个简介:
CMake,是“crossplatform make”的缩写,它是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CmakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是CMake 和 SCons 等其他类似系统的区别之处。
二、使用cmake生成OpenCV源代码工程的解决方案
这一步是全文的核心内容。为了讲解条理清晰,我们分步介绍:
<1>运行cmake-gui
如果没有生成桌面快捷方式,在安装路径下,如D:\Program Files(x86)\CMake 2.8\bin处找到cmake-gui.exe运行。
运行后得到如下的窗口:
<2>指定OpenCV的安装路径
如下图,点击红色方框内的“Browse Source”按钮,在弹出的对话框中指定出OpenCV安装时源代码的存储路径。
以当前最新版本的OpenCV 2.4.8安装在D:\Program Files下为例,则在此选择路径:D:\ProgramFiles\opencv\sources
其实我们可以发现,此路径下必须会有一个名为CMakeLists.txt的文件。
这个文件就是给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”按钮。
于是,cmake开始第一次源代码配置过程:
在cmake处理的过程中,也许会出现诸如
“Could not copy from: D:/Program Files(x86)/CMake 2.8/share/cmake 2.8/Templates/CMakeVSMacros2.vsmacros
to: C:/Users/浅墨/Documents/VisualStudio 2010/Projects/VSMacros80/CMakeMacros/CMakeVSMacros2.vsmacros”
的红色字样警告,因为这是系统用户的路径名有中文字符 “浅墨”照成的,因为cmake不认中文路径,但是只要我们在上面的第三步中设置生成的路径中没有中文就行了。就算有这个因为C:/Users/下有中文照成的错误,也对我们这次的生成无碍,不用去管他。
PS:关于系统用户名为中文,这是血的教训。之前在玩Unity3D游戏引擎的时候,被系统路径为中文虐了好一阵子,在unity官方商店下个插件就报错。在控制面板中更改用户名是治标不治本的办法,最后把系统user的Documents目录定位到别的地方才解决。不过这会造成一些在Documents路径下存了数据的软件数据丢失,甚至打不开。。。。。所以,血的教训。。。。浅墨在以后重装系统的时候,绝对不会以中文ID作为用户名了。
看到进度条读到尽头,出现了Configuring done字样,第一次的源码配置就完成了,如图
<5>第二次Configure
第一次配置完成之后,我们还需要进行第二次配置,于是再次点击“Configure”按钮。这次的配置是很快的,几秒钟就会再次出现“Configuring done”字样,并且红色的选中部分都正常了:
<6>点击Generate,大功告成
这样,就只剩下点一次Generate按钮,来生成最终的解决方案了:
因为之前已经有过两次的configure过程,所以生成解决方案也将是非常的快:
看到Generating done字样,就表示大功告成,可以去之前我们指定的F:\opencv下找寻我们生成的解决方案了。
PS:2.4.8的OpenCV用cmake生成的工程只有3点多M,相比之前2.4.6版本的OpenCV有3个多G的工程,浅墨一开始都以为生成出错了,但是点开sln工程,发现里面依然可以看到源代码。原来自从2.4.7版本起,opencv源代码就直接包含在了opencv的安装路径下,我们生成的sln工程,也只是连接到了opencv安装路径下的源文件而已,工程本身并不大。
三、编译OpenCV源代码
我们怀着忐忑的心态打开刚刚生成的热乎乎的“OpenCV.sln”解决方案,看到一个庞大的工程映入眼帘——这可是一个包含了67个项目的解决方案:
大家这个时候可以在解决方案资源管理界面,随意地点进去一个自己感兴趣的项目,比如opencv_core这个项目,在opencv_core/Src/matrix.cpp查看其中某个文件的源代码,浅墨截的这张图是大家都很熟悉的Mat类型的某个构造函数的源码:
一阵对源代码的欣赏之后,我们可以按【F5】或者使用其他各种操作来启动调试
编译过程:
编译结果:
编译用时5分钟左右,具体时间和机器配置关系比较大。通过浅墨的截图可以发现,这次编译成功了62个项目,失败了0,即没有出篓子,全部编译生成成功了。:D
另外,编译完成会得到这样的警告:
别紧张,这是正常的。因为OpenCV2.4.8的源代码工程默认将“ALL_BUILD”这个项目其设为了启动项,编译成功后,就会默认运行它。
而“ALL_BUILD”是一个项目生成周边的杂项,不是exe,本身不可以运行,所以就会弹出这样的提示。
关于启动项的指定,我们可以在解决方案资源管理器里面,对需要设为启动项的那个项目反键点击,在弹出的菜单项中点击【设为启动项(J)】进行设定。如下图:
其实我们编译OpenCV,就是得到了一些二进制的生成文件,如DLL和Lib、exe。
因为我们是在debug下编译的,所以在工程目录的bin\debug下会生成opencv 2.4.8的依赖库(700多M,有点大),可以供我们以后调用opencv时使用。
四、OpenCV代码行数统计
OpenCV到了2.4时代,源代码src部分已经有了170多M,而源代码行数,通过浅墨的统计,是68多万行。(这里浅墨不禁有些感慨,前两天刚在捣鼓的Unreal Engine 4的源码是144多万行,是OpenCV的两倍多。。。。)
可以看到,准确的OpenCV 2.4.8的源代码,有687,870行。
OK,盛宴开始,计算机视觉领域的大宝库——OpenCV的源码近眼前,不虚此生地欣赏它吧。
========================================================================================================
上面为Windows上配置,以下为Ubuntu中OpenCV编译及配置:
1. 安装相关软件包:
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg62-dev libtiff4-dev cmake libswscale-dev libjasper-dev2. cmake:
新建文件夹release -> cd release -> cmake -D CMAKE_BUILD_TYPE=DEBUG <OpenCV_SourceCode_Path>
3. make & make install
4. 配置library:
打开/etc/ld.so.conf.d/opencv.conf,在末尾加入/usr/local/lib (有可能是个空文件,没关系)
sudo ldconfig -> 编辑/etc/bash.bashrc -> 加入下面内容:PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig export PKG_CONFIG_PATH
5. 安装完成,测试下安装成果:将opencv源码包下的example/c拷贝出来,执行./build_all.sh
编译完后试一个人脸检测的程序:./facedetect --cascade="/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml" --scale=1.5 lena.jpg