未经博主允许,不得转载,谢谢理解
如何用相机自己完成无标识AR的实践,初试者可以参考这本经典教材《Mastering OpenCV》,国内译版译得有点像谷歌翻译,不推荐,推荐大家直接读原文了解作者实践的思路,也可以参考我的博客--《Mastering OpenCV》--3.Markless AR.无标识式AR (1)和《Mastering OpenCV》--3.Markless AR.无标识式AR (2)结合中英文版本和自己的理解给出的一些实践流程和细节,如有不妥,欢迎讨论指正。
对于源码的实践,我在编译时也觉得一系列的编译问题真的很头疼,还好最后都解决了。毕竟作者出版这本书太久了,如果不想自己修改源码实现编译的话,真的就要花一些功夫。这里给出我在ubuntu下成功编译的源码,以及应用程序。有部分修改,注意的是,标定参数为我自己的相机标定后的参数,在main函数中的calibration需要修改成您自己的相机参数。
下载地址:https://download.youkuaiyun.com/download/jucilan3330/10647771
环境:ubuntu 14.04 OpenCV-2.4.3 OpenGL-3.0
下面开始源码编译pipeline
1.opencv版本问题
首先编译一直出错,原因就是ORB和FREAK在opencv3.1下根本不能按照他定义的函数变量去定义函数,ORB都是virtual的,FREAK是根本找不到。有博客说只能在opencv-2.4.2到2.4.5这几个版本之间运行,源码下载在github上可以找到。见https://github.com/opencv/opencv/tree/2.4.2 or https://github.com/opencv/opencv/tree/2.4.3。 书中作者用的是2.4.2。
2.cmake安装
首先下载cmake-gui(我个人觉得用gui比较直观)
- 安装
sudo apt-get install cmake-qt-gui
cmake-gui
3.opengl+opencv编译问题
因为opencv编译,默认是不支持opengl的,所以你必须下源码重新编译。
如何在cmake编译opencv中将opengl支持加入,参考https://blog.youkuaiyun.com/Simple_Xiao/article/details/53978608的 “二、开始重编译“部分
- 在源码下新建build文件夹。
- 按下图输入cmake配置
- 依据上文参考网址完成generate
4.opencv编译
为了与之前安装的其他版本opencv不冲突,进入源码的build目录下
输入以下指令。
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local/open-2.4.3 ..
make
sudo make install
至此 opencv2.4.3 with OPENGL就已经完成了
5.编译代码中的使用
请在CMakeLists.txt里添加如下指令:
重点在于 SET OpenCV_DIR .
对于不同的项目 也可以通过修改这一行命令 set(OpenCV_DIR "/usr/local/opencv-可选择你要指定的opencv版本所在文件夹/share/OpenCV" )
cmake_minimum_required(VERSION 2.8)
project(xxx)
#OpenCV
find_package(OpenCV 2.4.3 REQUIRED)
include_directories( ${OpenCV_INCLUDE_DIRS} )
target_link_libraries( joinmap ${OpenCV_LIBS} )
install(TARGETS xxx RUNTIME DESTINATION bin)
6.其他opengl编译问题
我装的是opengl3.0版本,首先main函数和ARDrawingContext函数,要修改
#include <gl/gl.h>
#...
#...
// !!!
//修改成下面
#include <GL/glu.h>
#include <GL/glut.h>
#include <GL/gl.h>
程序编译时遇到错误:
/usr/bin/ld: CMakeFiles/ar_demo.dir/ARDrawingContext.cpp.o: undefined reference to symbol 'glScalef' //usr/lib/x86_64-linux-gnu/mesa/libGL.so.1: error adding symbols: DSO missing from command line collect2: error: ld returned 1 exit status |
主要还是CMakeLists.txt没能找到OpenGL的头文件或者是没能正确链接,修改CMakeList.txt即可,具体修改可以下载源码查看。