前言
最近心血来潮,想着用OpenCV做一个AR的小应用,也是看知乎的回答,想到了识别二维码,然后在二维码上放视频,就花了大概两三天做出了这个小demo,完成度大概有70%,这篇文章简单说明一下。
总体思路
实现这个AR demo,首先就是识别到二维码,然后根据二维码的位置信息,通过透视变换得到一个区域,然后用过掩码的方式,将一段视频叠加到实时场景中。根据上面所说的,用到的技术分为三点
1 二维码检测
在这个demo中,只需要检测二维码的位置就可以了,所以用的是这个API,用法也是很简单的,第一个参数为待检测的图像,第二个参数为二维码的四个顶点坐标,返回值表示是否含有二维码
bool cv::QRCodeDetector::detect(InputArray img,
OutputArray points)
2 透视变换
得到二维码的四个定点之后,随着视角的移动,二维码的四个定点肯定不是正方形的形状,这就需要我们叠加的视频区“适配”二维码的视角,这就需要仿射变换和透视变换,
本项目使用的是透视变换,在OpenCV中,可以通过warpPerspective函数实现,具体的实现可以参考完整的代码。
3 掩码mask操作
得到了放射变换之后的图,我们还需要把图片贴上去,这就用到了很常见的mask掩码操作,就是生成一个mask图像,在mask图像中(一般是灰度图),只像copy素值不为0的像素点,简单的实例如下:
dst_warp.copyTo(frame_bg, mask);
完整代码
#include
#include
using namespace cv;
using namespace std;
int main(int argc, char* argv[]) {
if (argc != 2) {
std::cout << "eg. " << argv[0] << " video" << std::endl;
return 0;
}
// bg is camera
VideoCapture cap_bg(2); // 2 is camera index
// cap_bg.set(CAP_PROP_FRAME_WIDTH, 1280);
// cap_bg.set(CAP_PROP_FRAME_HEIGHT, 720);
VideoCapture cap_show(argv[1]);
if (!cap_show.isOpened()) {
std::cout << "open video failed!" << std::endl;
return 0;
}
Point2f srcPoints[4];//原图中的四点 ,一个包含三维点(x,y)的数组,其中x、y是浮点型数
Point2f dstPoints[4];//目标图中的三点
Mat frame_bg;
Mat frame_show;
Mat dst_warp;
QRCodeDetector qrcodedetector;
vector
反思改进
1 可以看出来,演示的视频还是有很多误检测的,会出现一闪一闪的情况,这种情况就需要进行滤波,改善闪的情况。
2 其实AR的最重要一部分就是动画的渲染,这个demo中只是通过类似于添加logo的方式渲染的,更加专业的话,其实是可以用专门的工具进行的,比如OpenGL等。
审核编辑:刘清
-
Ar
+关注
关注
24文章
5096浏览量
169478 -
OpenGL
+关注
关注
1文章
85浏览量
29243 -
OpenCV
+关注
关注
31文章
635浏览量
41340
发布评论请先 登录
相关推荐
评论