0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

用OpenCV做一个AR的小应用

冬至子 来源:技术铺子 作者:chasenzhang 2023-01-18 12:39 次阅读

前言

最近心血来潮,想着用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
    Ar
    +关注

    关注

    24

    文章

    4966

    浏览量

    167389
  • OpenGL
    +关注

    关注

    1

    文章

    84

    浏览量

    29026
  • OpenCV
    +关注

    关注

    29

    文章

    611

    浏览量

    40789
收藏 人收藏

    评论

    相关推荐

    求助。。。。。怎么LABVIEW做一个8253的芯片?

    求助。。。。。怎么LABVIEW做一个8253的芯片?并用LABVIEW做这个芯片的仿真?我是点都不懂的 ,望高手指教。现在正在自学,是老师要在我们这些学生中选个人做课题,大概就是想看看我们能作出个什么样来。  谢
    发表于 11-24 19:14

    做一个简单的示波器,啥屏幕好呢

    我现在有块,fpga开发板,板子上有10bit的adc,型号是tlc549,还有不带字库的12864,这样可以了吗,有
    发表于 01-19 11:27

    怎么LabVIEW做一个用户登录界面?

    `怎么LabVIEW做一个用户登录界面?只要有用户名、密码,登录和退出按钮`
    发表于 06-07 15:10

    labview做一个PID控制系统

    labview做一个简单的PID控制系统
    发表于 02-13 17:17

    做一个声敏电阻,新手问题求助

    新手,想做一个声敏电阻,然后用ad输出返回值计算再在液晶上显示声音分贝数的东西,,这个想法现实吗?如果现实什么声敏电阻较好,又或者不能这样做那需要买什么样的声敏模块(是不是都比较
    发表于 05-05 09:39

    跪求大神labview做一个记账的系统

    有没有大神可以labview做一个记账的系统啊?
    发表于 11-30 20:48

    Qt使用openCV

    使用Qt加OpenCV进行数字图像处理了还是很不错的,参考网上一个帖子分享下经验:环境:Windows下的Qt4.7.0安装qt-sdk-win-opensource-4.7下载OpenC
    发表于 11-22 16:12

    proteus做一个桃心,寻求思路

    最近学校开设了Proteus电路仿真课程,我想用二极管做一个桃心的表白设计,现在想寻求思路。我自己能想到的就是二极管设计心形,然后利用单片机实行流水灯。各位大神有什么高见吗? ^
    发表于 10-25 20:23

    【芯灵思A83T试用体验】3、交叉编译OpenCV2.4.9

    的效果。如上图,我这里通过V4L2获取了UVC相机拍摄的图片,视场中有标定靶,我们通过OpenCV里的库函数识别出两圆的位置,并加以跟踪,在圆心处绘制蓝色的点。 1024 x 7
    发表于 05-21 22:17

    打算NORDIC蓝牙方案做一个音箱

    最近打算NORDIC蓝牙方案做一个音箱,有用NORDIC蓝牙方案做过音箱的的吗,该方案有没有优势呢?
    发表于 09-07 11:48

    labview做一个温控系统

    各位大哥,我想用labview做一个温控系统,具体思路是PT100加电压变送器传给NI6002采集卡电压信号,然后采集卡输送
    发表于 04-17 15:02

    请问怎么样labVIEW做一个火警的声音警告 ?

    本帖最后由 只耳朵怪 于 2018-6-8 17:40 编辑 萌新求大神教下怎么样labVIEW做一个火警的声音警告 ,求大佬写
    发表于 06-08 16:58

    在DM8168上移植opencv一个版本比较好?

    请教下,在DM8168上移植opencv一个版本比较好?DSP支持opencv的哪个版本?ubuntu
    发表于 08-19 07:43

    怎么labview软件做一个打地鼠小游戏

    怎么labview软件做一个打地鼠小游戏,求助!!!
    发表于 05-15 17:38

    OpenMV怎么?如何用OpenMV做一个电磁炮?

    OpenMV怎么?如何用OpenMV做一个电磁炮?
    发表于 10-20 07:30