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

    文章

    5096

    浏览量

    169478
  • OpenGL
    +关注

    关注

    1

    文章

    85

    浏览量

    29243
  • OpenCV
    +关注

    关注

    31

    文章

    635

    浏览量

    41340
收藏 人收藏

    评论

    相关推荐

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

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

    OpenCV进行基本绘图_《OpenCV3编程入门》书本配套源

    OpenCV3编程入门》书本配套源代码:OpenCV进行基本绘图
    发表于 05-11 16:46 36次下载

    OpenCV进行基本绘图_OpenCV3编程入门-源码例程

    OpenCV3编程入门-源码例程全集-OpenCV进行基本绘图,感兴趣的小伙伴们可以瞧瞧。
    发表于 09-18 17:02 3次下载

    如何用labview做一个数码管显示数字

    labview做一个数码管显示数字
    发表于 01-02 19:16 112次下载

    打火机做一个小坦克

    打火机大部分由塑料做成,价格便宜,也没人回收。因此,我们可以打火机为材料做一个简易的USB LED灯。这个教程我决定1打火机和USB线来做,它不但可以连接移动电源,而且在黑暗中也
    的头像 发表于 01-14 17:04 7597次阅读

    如何用所学的鸿蒙知识做一个小应用

    的视频应用,说真的,看到这个活动我很开心,又可以所学的鸿蒙知识来做一个小应用了!   看了小提示,都是 JS 组件来实现的,当我看到分布式也可以 JS 来写时,当时觉得 JS 也太强大了,因为之前写的 Demo 都是
    的头像 发表于 10-19 09:23 1748次阅读

    利用OpenCV构建RaspberryPi运动检测系统

    OpenCV强大的工具,结合RaspberryPi可以打开许多便携式智能设备的大门,我们将学习如何利用OpenCV的强大功能并在我们的实时闭路电视画面上构建
    发表于 08-01 16:48 1335次阅读
    利用<b class='flag-5'>OpenCV</b>构建<b class='flag-5'>一</b><b class='flag-5'>个</b>RaspberryPi运动检测系统

    3行代码做一个WebServer

    电子发烧友网站提供《3行代码做一个WebServer.zip》资料免费下载
    发表于 10-28 16:52 0次下载
    <b class='flag-5'>用</b>3行代码<b class='flag-5'>做一个</b>WebServer

    LDR做一个自动夜灯

    电子发烧友网站提供《LDR做一个自动夜灯.zip》资料免费下载
    发表于 10-28 14:21 0次下载
    <b class='flag-5'>用</b>LDR<b class='flag-5'>做一个</b>自动夜灯

    DHT11和LCD1602A做一个气象站

    电子发烧友网站提供《DHT11和LCD1602A做一个气象站.zip》资料免费下载
    发表于 12-22 15:24 0次下载
    <b class='flag-5'>用</b>DHT11和LCD1602A<b class='flag-5'>做一个</b>气象站

    OpenCV常用的 7 示例(Python版)1

    OpenCV是计算机视觉领域最流行的库之。它最初是 C 和 C++ 编写的。现在也可以在 Python 中使用。它最初是由英特尔开发的。该库是
    的头像 发表于 02-07 16:23 1148次阅读

    OpenCV常用的 7 示例(Python版)2

    OpenCV是计算机视觉领域最流行的库之。它最初是 C 和 C++ 编写的。现在也可以在 Python 中使用。它最初是由英特尔开发的。该库是
    的头像 发表于 02-07 16:23 1026次阅读

    OpenCV常用的 7 示例(Python版)3

    OpenCV是计算机视觉领域最流行的库之。它最初是 C 和 C++ 编写的。现在也可以在 Python 中使用。它最初是由英特尔开发的。该库是
    的头像 发表于 02-07 16:23 1016次阅读

    Arduino做一个语音应用程序来打开和关闭警报

    电子发烧友网站提供《Arduino做一个语音应用程序来打开和关闭警报.zip》资料免费下载
    发表于 07-10 10:46 0次下载
    <b class='flag-5'>用</b>Arduino<b class='flag-5'>做一个</b>语音应用程序来打开和关闭警报

    opencv-python和opencv样吗

    样。OpenCV(Open Source Computer Vision Library)是开源的计算机视觉和机器学习软件库,它提供了大量的图像和视频处理功能。
    的头像 发表于 07-16 10:38 1166次阅读