首页 > 代码库 > opencv_contrib based on CMake全过程

opencv_contrib based on CMake全过程

  今天,我要来讲点有趣的事情。我这人吧,就爱倒腾各种新奇的东西,准确说是不停有新事物来缠上我。就在这两天,我想用OpenCV玩玩人脸识别,然后悲剧出现了,这VS给我头文件声明中的face.hpp加了个下划线,这最新版的OpenCV连个人脸识别模块都没有嘛?抱着疑惑我去访问了OpenCV的github,只见里面这样写着[1]:

This repository is intended for development of so-called “extra” modules, contributed functionality. New modules quite often do not have stable API, and they are not well-tested. Thus, they shouldn’t be released as a part of official OpenCV distribution, since the library maintains binary compatibility, and tries to provide decent performance and stability.

So, all the new modules should be developed separately, and published in the opencv_contrib repository at first. Later, when the module matures and gains popularity, it is moved to the central OpenCV repository, and the development team provides production quality support for this module.

  大致意思就是说,现在下载的都是OpenCV的主要模块,而额外的一些模块还在github上存着,因为它们的运行还不够稳定,需要程序员改进它们然后才能正式发布出来。当即无语,这版本高了反而东西都被分离出去了,怪不得这开源库占的空间变少了,这不就给我们添加麻烦了吗?然后,开发者在下面注明了解决方法,我先贴在这里,你们看看:

  1. start cmake-gui
  2. select the opencv source code folder and the folder where binaries will be built (the 2 upper forms of the interface)
  3. press the configure button. you will see all the opencv build parameters in the central interface
  4. browse the parameters and look for the form called OPENCV_EXTRA_MODULES_PATH (use the search form to focus rapidly on it)
  5. complete this OPENCV_EXTRA_MODULES_PATH by the proper pathname to the <opencv_contrib>/modules value using its browse button.
  6. press the configure button followed by the generate button (the first time, you will be asked which makefile style to use)
  7. build the opencv core with the method you chose (make and make install if you chose Unix makfile at step 6)
  8. to run, linker flags to contrib modules will need to be added to use them in your code/IDE. For example to use the aruco module, “-lopencv_aruco” flag will be added.

?   我当时就想,还好他给了解决办法,我就下载个CMake,照着这个来一遍,应该很容易就可以用我想用的模块了。不得不说,我真的太天真了,老外这清新脱俗的八句话,我整整搞了两天,two days! 经过我坚持不懈地查阅资料,千辛万苦之后终于可以用到那些额外的模块了。我做个整理写成这篇博文,希望大伙少走些弯路。

  如果你们急需想用OpenCV的,请自动忽略我上面的废话。下面进入正题。

  本人配置:Visual Studio 2015 Community,OpenCV 3.2,CMake 3.8.0

Step1 下载并安装CMake

  CMake是一个跨平台的编译工具,可以模拟Unix、Windows等开发环境下的编译过程,至于它具体能用来做些什么,因为我也不甚了解,所以不做过多说明。在今天这个场合里,它将起到特别关键的作用。附上CMake官网的下载地址:

https://cmake.org/download/

然后在Latest Release(3.8.0)中的Binary distributions里面根据个人需要下载,msi和ZIP都是可以的。我选择的是windows64位的msi(以下是msi的操作过程)。

下载完成后开始安装。

技术分享

按图片所示选择,然后点Next。

技术分享

这里选择CMake的安装地址,然后点Next,安装开始。

安装结束后,打开安装所在文件夹,点击bin文件夹,里面的cmake-gui就是图形界面的CMake程序了。如下图

技术分享

Step2 配置OpenCV主要模块

  进行这一步之前,请确保各位电脑里已经有了OpenCV,并是最新版本,不要问我为什么,为了保险。没有的,先去OpenCV官网自行下载。

  然后,创建一个新文件夹作为编译文件的储存地点,新文件夹建立地点随意,我是建立在OpenCV的文件夹(这是我建的文件夹,主要模块,额外模块和合成模块都放在这个文件夹里,下面都按这个来,你们可以参照我的 )内,并命名为opencvbuild,意为主要模块和额外模块合体后的OpenCV。

  打开cmake-gui:

技术分享

  注意,第一个空一定要选择下载的opencv文件夹内的sources文件夹,第二个空格则选择你新建的文件夹,按你们的实际情况来填。然后点击Configure(配置),出现如下窗口
技术分享
在红框内选择你电脑里已有的IDE,我是VS 2015 64位,故选择图中所示。

接着是漫长的等待,痛苦的东西就要来临了!

第一个错误

技术分享

  就看到它一直在download一个叫opencv_ffmpeg.dll的东西,停顿了好久,就给我弹出个错误提示。这提示主要是说哈希值不匹配,下载不成功。玩外国人的东西,沟通障碍经常发生,特别是下载东西的时候,真的很让人头疼,基本都是连接问题。既然自动下载不成功,那我们就改手动下载吧(当然你也可以选择多试几次Configure,但是这样成功率低又耗费时间,我不推荐 )。图中黑框标出的是我们需要的ffmpeg.dll的哈希值。为了小伙伴们方便下载,我直接在这里附上网盘链接(ffmpeg.dll和ffmpeg64.dll可以一起下载,都会出现错误提示的

ffmpeg.dll哈希值f081abd9d6ca7e425d340ce586f9c090

ffmpeg64.dll哈希值a423363a6eb76d362ca6c406c96c8db6 在此处下载

http://pan.baidu.com/s/1o7WzXcm

ffmpeg.dll哈希值89c783eee1c47bfc733f08334ec2e31c

ffmpeg64.dll哈希值35fe6ccdda6d7a04e9056b0d73b98e76 在此处下载

http://pan.baidu.com/s/1mibTCus

注意对照错误提示(上图红框)中的哈希值,下载一个网盘链接就够了,不要多下,也不要弄错哈希值!

比较常见的就是这两类ffmpeg文件,如遇到不包括上面的哈希值,则需要去github下载,网址在这里:

https://github.com/opencv/opencv_3rdparty/branches/all

实在不会的可以在下面留言,我再细说,这里不再赘述了。

将下载的dll文件替换下面地址内的dll文件,请自行对照查找该地址。

将下载的dll文件替换下面地址内的dll文件,自行对照查找该地址。

\opencv\sources\3rdparty\ffmpeg\downloads\f081abd9d6ca7e425d340ce586f9c090

上面的地址只是举了其中一个例子,最后一块(f081abd….)即下载的dll文件的哈希值,不要放错位置。

回到cmake-gui界面,点击Configure继续配置。竟然可以继续下去了,仿佛看到了希望,然而好景不长。

第二个错误

技术分享

  这回是开始下载一个叫ippicv的压缩包了,心里暗骂。但是已经有了前一个错误的经验了,要保持淡定,它要下载啥我们就帮它下载啥。于是我们进入上面给你们的github网址,然后注意图中红框标出来的部分,它提示我们要下载20151201版本的,在网址中找到ippicv/master_20151201,进去找到一个zip文件,文件名为

ippicv windows 20151201.zip,把它下载下来即可。当然,如果错误提示中不是这个版本的,就要按照错误提示中的要求下载其他版本。这里附上20151201版本的压缩包网盘链接:

http://pan.baidu.com/s/1o8t09ui

注意,这个压缩包要与下述地址内的压缩包替换,也就是ippicv所在文件夹

\opencv\sources\3rdparty\ippicv\downloads\windows-04e81ce5d0e329c3fbc606ae32cad44d

到这里,就可以再次回到CMake-gui界面点击Configure了!还真的成功了!

技术分享

  出现了Configuring done字样,说明你的配置完成了,然而上面的框子中是红色的,没有关系,我们再点击一次Configure

技术分享

  这回是完全正常了。到这里,OpenCV的主要模块算是配置完了,下面要把OpenCV的额外模块也配置到一块儿来。

Step3 配置OpenCV额外模块

  配置额外模块,我们就得先把额外模块的源代码拉到自己电脑上来,天真的我直接去github网站上pull下来了,然后发现不停地出错。纳闷了好久,后来终于知道了解决方法,原来不能直接pull github上的contrib源代码,要去下载opencv_contrib的release版本。这里附上下载地址(这个比较方便,就不放网盘链接了):

https://github.com/opencv/opencv_contrib/releases

选择第一个3.2.0 zip版本即可,下载到OpenCV文件夹内,并解压到当前文件夹。

回到CMake-gui界面,如下图输入进行查找

技术分享

此时出现了OPENCV_EXTRA_MODULES_PATH这个栏目,在Value处选择modules所在的路径,注意是opencv_contrib的modules,一定要是modules(modules其实就是存放OpenCV额外模块源代码的地方)。然后点击Configure进行配置。结果又有问题出现了。

第三个错误

技术分享

  这回是一个叫protobuf-cpp-3.1.0.tar.gz的文件在作怪了,又是哈希值不匹配,又是故伎重演。马上去寻求万能的CSDN下载频道,把这个文件给找来了。还是奉上网盘链接:

http://pan.baidu.com/s/1eSGb4o6

将这个压缩包替换下列地址原有的压缩包,无需解压。

\opencv_contrib-3.2.0\
modules\dnn.download\bd5e3eed635a8d32e2b99658633815ef\v3.1.0

也就是错误提示中的地址。 点击Configure

Oh my god!它竟然顺利地进行下去了!实在是太激动了!这一次的configuring done 意味着OpenCV的主要模块和额外模块已经结合在了一起,最后,让我们点击一下Configure右边的Generate,来生成编译文件。这回速度相当快,而且出现了Generating done,说明编译工作已经全部完成了!

Step4 配置VS连接OpenCV

  其实编译工作是已经做完了,CMake到这里也算是尽职了。这一步也是最后一步,我们的工作就是把VS和结合版的OpenCV连接起来,这个其实跟OpenCV主要模块的设置差不多,玩过OpenCV的人应该都会使用。

  我们先到存放结合版OpenCV的opencvbuild文件中找到OpenCV.sln文件,这是个解决方案文件,我们将它打开。

技术分享

  右键点击解决方案,点击方框中所示的重新生成解决方案,接着就是漫长的等待。因为里面项目太多,所以生成解决方案要一段时间,差不多10分钟吧。

技术分享

  生成成功了114个。

技术分享

如上图所示,点击CMakeTargets,再右键INSTALL,点击仅用于项目中的仅生成INSTALL。到这里我们需要的lib都已经生成了,下面就是要把OpenCV链接到VS上了。首先,我们随便打开一个自己的项目

技术分享

  点击右边的属性管理器,点击Debug|x64(这里注意要根据自己的需求选择,看你是常用debug还是release,系统是32位还是64位),右键Microsoft.Cpp.x64.user,点击属性

技术分享

  点击VC++目录,先填写包含目录,如下图填写。

技术分享

  再填写库目录,如下图填写。

技术分享

  最后,点击链接器,点击输入,填写附加依赖项

技术分享

  附加依赖项中填写内容如下,感谢cosmispower博客的提供,我会在下面特别指出

opencv_aruco320d.lib  
opencv_bgsegm320d.lib  
opencv_bioinspired320d.lib  
opencv_calib3d320d.lib  
opencv_ccalib320d.lib  
opencv_core320d.lib  
opencv_datasets320d.lib  
opencv_dnn320d.lib  
opencv_dpm320d.lib  
opencv_face320d.lib  
opencv_features2d320d.lib  
opencv_flann320d.lib  
opencv_fuzzy320d.lib  
opencv_highgui320d.lib  
opencv_imgcodecs320d.lib  
opencv_imgproc320d.lib  
opencv_line_descriptor320d.lib  
opencv_ml320d.lib  
opencv_objdetect320d.lib  
opencv_optflow320d.lib  
opencv_phase_unwrapping320d.lib  
opencv_photo320d.lib  
opencv_plot320d.lib  
opencv_reg320d.lib  
opencv_rgbd320d.lib  
opencv_saliency320d.lib  
opencv_shape320d.lib  
opencv_stereo320d.lib  
opencv_stitching320d.lib  
opencv_structured_light320d.lib  
opencv_superres320d.lib  
opencv_surface_matching320d.lib  
opencv_text320d.lib  
opencv_tracking320d.lib  
opencv_video320d.lib  
opencv_videoio320d.lib  
opencv_videostab320d.lib  
opencv_xfeatures2d320d.lib  
opencv_ximgproc320d.lib  
opencv_xobjdetect320d.lib  
opencv_xobjdetect320d.lib  

  将这个复制粘贴过去即可,注意,这些都是debug版本的,如果你是release版本的,请把每行里面的d字母去掉再粘贴。

  然后,要设置系统变量,回到桌面,右键点击计算机,点击属性,点击高级系统设置,点击环境变量,在系统变量一栏中找到Path,在里面添上如下地址,别忘了分号隔开。

D:\OpenCV\opencv_contrib\install\x64\vc14\bin;(这是我的地址,要填自己的)

至此,所有工作都已经完成,大家可以去试试是不是可以使用那些额外模块了。我在这里做几点总结:

1.玩老外的产品时,遇到错误一定要仔细阅读错误提示,对症下药,而且很多都是因为网络问题造成的,可选择自行下载!

2.开源库存放代码的网站真的很重要,比如github,因为上面会有开发者的指导,虽然有时候并不能很好地理解,但是总比独自摸索好!

3.最后,还得推崇下伟大的CSDN,大牛多,下载各种资源的首选地!

献上参考资料,并再次感谢以下前辈们的指导!
[1]https://github.com/opencv/opencv_contrib “github”
[2]http://www.cnblogs.com/Yan47/articles/5967537.html “OpenCV下使用CMake”
[3]http://blog.csdn.net/cosmispower/article/details/60601151 “opencv3.2+opencv_contrib+cmake”

<script type="text/javascript"> $(function () { $(‘pre.prettyprint code‘).each(function () { var lines = $(this).text().split(‘\n‘).length; var $numbering = $(‘
    ‘).addClass(‘pre-numbering‘).hide(); $(this).addClass(‘has-numbering‘).parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($(‘
  • ‘).text(i)); }; $numbering.fadeIn(1700); }); }); </script>

    opencv_contrib based on CMake全过程