今天在使用opencv3.4版本的内部特征点算法的时候,竟然提醒我
黑人问号脸??????什么cpp,怎么调用opencv内部的函数还会特么出问题呢、还偏偏出在Compute()函数调用的时候。
搜了搜博客,竟然是opencv需要cmake?纳尼?为什么需要cmake?cmake有啥用?
为什么需要Cmake
你有没有发现,调用opencv的时候想要查看他们的cpp文件,都找不到。顶多只能找到h文件。说好的opencv开源呢,摔!啊,别急啊。就是开源的,但是需要你cmake,cmake以后就能看到他们的cpp源代码了。
原理:opencv将很多函数加入了函数库,并被编译成了dll,所以我们只能看到函数声明,看不到源代码。
来看看我们的opencv文件夹:
build目录是编译生成的目录,就是用openCV源代码编译生成的2进制库文件集(dll、lib和入口头文件include)。对于编程来说,仅仅需要build这一个文件夹就可以了。因为build文件夹就是在其他文件夹的基础上CMake编译生成的。大部分源代码放在modules文件夹下。
你看,我的source文件夹下是有feature2d.cpp的哦:
但是好奇怪啊。为什么vs看不到cpp文件呢?
在3.0之后版本的Opencv对Sift、Sufer等新算法没有提供直接编译好的动态库来加载使用,因此必须自己编译。这是因为Sift、Sufer算法专利现在是属于哥伦比亚大学,因此opencv对这部分内容及“所谓的”不稳定模块全都放到opencv_contrib中。且只在它的Github中能够找到,opencv的官网上是没有的。因此对于想使用Sift、Sufer、双目立体匹配算法、结构光等新的算法及有专利权算法的同学需要自行编译。
进行Cmake
参考该帖子:https://segmentfault.com/a/1190000003496009
我在github上下载了cmake3.12.4,https://github.com/Kitware/CMake/releases?after=v3.13.2
然后在github上下载opencv额外包:https://github.com/opencv/opencv_contrib
打开cmake-gui.exe,填上路径,选择好编译器,进行编译(先用vs2015进行编译),如果你的项目经常在x86下编译,就选择vs 14 2015,如果你的项目再x64平台下编译,就选择带Win64的。我是x64,就选这个了。
恩,之前选错了,编译了好久,现在这个x64的编译很快。。。。。
编译玩以后会出现Name和Value的框框,这时候把OPENCVEXTRAMODULESPATH的参数设置成opencvcontrib的路径,如下:
因为之前看到有帖子说:
所以我直接也把这个给勾上:
然后点击configure,开始漫长的等待。。。。
来看看opencv_contirb,我发现了这个文件,我说怎么看好多帖子,说自己用的是opencv3.x,然后项目中还用到了xfeatures2d.hpp和nonfree.hpp,但是我的opencv却找不到这个文件,原来是在扩展库下。看来真的需要自己编译。
诶?报错了,可以看到有些东西cmake根本找不到。那就把那些对号给去掉:
再来,我。。。。看来今天人品不咋样,configure都出错:
什么重复的模块名字???
- - 有老司机告诉我,要用source code,不要用exe运行出来的代码。然后我用了opencv3.4.1的源码,非exe。
开始了新一轮的cmake。这里要说明的是,除了上面我说的要勾上的,还有些东西要勾上:
就这样,重新configure,然后红色消失了。
点击generate:
vs打开opencv.sln
如下:
然后在项目上右键,重新生成解决方案,这里需要很久,该忙啥忙啥去。扣扣脚,打打游戏,看看美剧。恩。
过了一个多小时,我回来了,然后。emmmm,真香。
出现最多的问题是这个:
然后经过了漫长的尝试。先是换了cmake版本,换成了3.8,然后换了opencv_contrib,因为我单独cmake opencv是没有问题的,所以推断是opencv_contrib版本不一致导致。最后。
cmake3.8,opencv3.4.1,opencv_contrib3.4.1,vs2015
完美。
重新生成解决方案以后,对着install右键针对项目仅生成就可以了。
接下来就是配置环境变量了。
教训:版本真是个大坑
------------------------------------------------END----------------------------------------------------