最近分析了下mastering OpenCV 第三章markerless AR的源码,这个例子是基于自然标志物的增强现实,在这个例子中,使用一个图片作为模板标识,这个图片应该有一定的特征,感觉像天空大海什么的,没有太多特征的图片,在这上面做增强现实,就很不好弄。
源码及编译文件下载地址:无标识的AR的OpenCV实现-Linux
好把,少扯淡,赶紧上源码分析。
我觉得能看到这个主题博客的,对于编译什么的都没问题吧,要么是VS在windows上,要么linux终端或QT上,MAC本人屌丝,没玩过,不过对于编译OpenCV来说,想来也差不多吧。
这里要注意的一点是,编译OpenCV的时候要添加支持OpenGL,因为本源码是基于OpenGL GUI窗口的,这和第二章中的使用GLUT作为显示窗口是有区别的,不过,要是不想弄OpenCV编译的话,改成GLUT显示的也不太费事,我这里并没有改,说好的源码分析,就按源码来吧。
注意:sudo apt-get install libgtkglext1 libgtkglext1-dev
要编译支持OpenGL的OpenCV,在有OpenGL的情况下,要安装这两个库。才能在cmake时配置OpenCV support。
关于人工标识和自然标识对实现增强现实的区别,请自行百度,这里只提下,自然标识的更好玩点,全是人工标识,这没法发展啊。好吧,对部分遮挡可以识别,可以做到更好的虚实融合。
Begin:
1:首先找main函数,在main函数开始,
// Change this calibration to yours:
CameraCalibration calibration(526.58037684199849f, 524.65577209994706f, 318.41744018680112f, 202.96659047014398f);
这里是对相机的内参数进行处理,这个调用在CameraCalibration.hpp和.cpp中进行实现,这几个参数就是在相机校正时得到的内参数矩阵中的值,关于求相机内参数的问题请查看前几篇博客,有详细的说明,这里只使用了内参数,在后面会构造内参数矩阵,作为透视变换的矩阵,失真向量全为0。
2:接下来开始检测在运行程序时,输入参数的个数,若小于2个,那退出,等于两个,这个就是摄像头实时拍摄了。
cv::VideoCapture cap;
if (cap.open(0))
{
processVideo(patternImage, calibration, cap);
}
在proccessVideo开头添加一下,就可以得到一帧帧图像了。
cv::Mat currentFrame;
capture >> currentFrame;
// Check the capture succeeded:
if (currentFrame.empty())
{
std::cout << "Cannot open video capture device" <<