专栏首页无雨森的技术分享KinectAzureDK编程实战_OpenCV + OpenGL 的 AR 应用的实现

KinectAzureDK编程实战_OpenCV + OpenGL 的 AR 应用的实现

上篇文章,我们讲了如何用 OpenGL 原生的显示 Kinect 的 raw data 的代码。后面的文章,我将实现一个非常简单的 AR 程序。在这篇文章之前,有《Mastering OpenCV with Practical Computer Vision Projects》 第二章在 iPad 和 iPhone 上实现的 AR 应用,第三章在电脑主机上实现的 AR 应用。

五年前,我在刚踏入计算机图形学这个领域进行我的研究生涯时,自己独立做的第一个项目就是在 Android 手机上实现的一个简单的 AR 应用,并在知乎上根据我的经验回答了一个问题,目前是最高赞。

想用OpenCV做AR该如何入手? https://www.zhihu.com/question/26983174/answer/35328819

我在实现这个项目时就借鉴了非常多这本书第三章的代码。

但是,这篇文章中有几个地方没必要亲自去实现。首先,以普通的彩色图片作为模板的识别和以二维码风格的模板的识别是没有必要的。现在有类似于 ArUco 这种被工业和科研广泛应用的模板库。

另外,为了让 OpenCV 和 OpenGL 能放在一起应用,我们不得不用 CMake 重新编译 OpenCV,令 OpenCV 支持 OpenGL。在实际代码中,我们需要在 OpenCV 内部创建的 OpenGL 环境中渲染,虽然 OpenCV 这是在为我们隐藏技术细节,让我们更好的集中在渲染和图像处理上。

但是以我重新编译 OpenCV 的经验,编译一个完整版本的 OpenCV 是非常耗时的。我在我的知乎答案中提到的做法是:使用多线程,程序主线程做 OpenGL 的渲染,另外声明一个线程来接收摄像头输出的实时帧。

在这篇文章中,我将借助 ArUco 来实现一个简单的 AR 应用。

如上,这就是我实现的 AR 效果。

关于 ArUco的应用以及性能测试,可以参看我之前写的一篇文章。

在上篇文章中,我写了如何使用多线程读取 Kinect 的 RGB \ Depth \ IR 图像。

下面我将在上篇文章的代码的基础上,实现我们的 AR 应用。

这部分代码完全基于上篇文章。其中如何用多线程实现 读\取 Kinect 的 RGB 图像的代码,这里就不再赘述,请参看如下文章。

原生使用 OpenGL 显示 Kinect 的实时 RGB 图像 无雨森,公众号:无雨森的技术分享KinectAzureDK编程实战_OpenGL 显示 Kinect 数据

其余的部分,我们一点一点看。

void drawCubeModel()
{
  \\...
}
void axis(float size)
{
  \\...
}

这部分代码是显示坐标系和正方体的代码。引用自《Mastering OpenCV with Practical Computer Vision Projects》第三章,P121。

void drawAugmentedScene()
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glLoadMatrixd(proj_matrix);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glLoadMatrixd(modelview_matrix);

    axis(0.1);
    drawCubeModel();
}

drawAugmentedScene 函数是渲染 AR 的核心代码。在渲染 AR 时,需要加载投影矩阵和模型视图矩阵。关于这两个矩阵的计算可以看《Mastering OpenCV with Practical Computer Vision Projects》第二章,P88的讲解。也可看我在知乎上的讲解。

想用OpenCV做AR该如何入手? https://www.zhihu.com/question/26983174/answer/35328819

在这里,我们就不用这本书的代码了,直接用 ArUco 提供的函数即可。

首先,我们来看怎么得到投影矩阵。

投影矩阵实际上是由摄像头参数定义的矩阵。所以,我们首先需要知道摄像头的内参。然后把内参转换为 OpenGL 的投影矩阵。

正常来说,我们应该首先标定摄像头。在这里,我们用的是 Kinect Azure DK,可以直接通过 Kinect 的函数就可以获取摄像头内参。

先定义关于 ArUco 的变量。

aruco::Dictionary dic;
Mat generatedMarker;
aruco::CameraParameters CamParam;
aruco::MarkerDetector MDetector;
std::map<int, aruco::MarkerPoseTracker> MTracker;
float MarkerSize = 0.1f;

关于这几个变量的意思,请参看我写过的文章。

ArUco的应用以及性能测试 无雨森,公众号:无雨森的技术分享增强现实ArUco二维码库的测试与应用

我们通过 Kinect 预定义的 config 参数来获取内参,并转为 OpenCV 的 Mat 格式。

接下来,我们

再看 frameRetriever 函数。

在这个函数中,逐帧的检测 ArUco 模板图片。并提取这个模板图片相对于摄像头的位姿,即我们需要的模型视图矩阵。

然后在 display 函数中,同时显示实时视频帧以及 AR 三维图形。

void display()
{
  drawBackground();
  drawAugmentedScene();
  glutSwapBuffers();
}

上面用的还是 GL 1 固定管线形式的代码,后面我会写一个基于 GL 3 使用 GLFW 和 GLEW 的 Shader 形式的代码。

本文的所有代码都将在 Github 和 Coding 上开源。敬请关注我的 Github 和 Coding 主页。

Github 主页

https://github.com/forestsen

Coding 主页

https://coding.net/u/forestsen

商业合作:

E-mail: forestsen@vip.qq.com

本文分享自微信公众号 - 无雨森的技术分享(forestsen_tech),作者:无雨森

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-08-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何用 OpenCV + OpenGL 在 Android 端实现 AR 程序系列文章

    这篇系列文章源于最近在用微软公司出品的新款 Kinect Azure DK。我需要基于这个平台实现一个实时重建系统。基于这个深度摄像头,我接连实现了用 Open...

    无雨森
  • KinectAzureDK编程实战_OpenGL 显示 Kinect 数据

    这是关于如何用 PCL 打开 Kinect Azure DK,并可视化彩色点云。对应的文章是我半个月前写的《KinectAzureDK编程实战_PCL》。

    无雨森
  • KinectAzureDK编程实战_实时双Kinect标定

    之前文章讲了如何使用 OpenCV 读取 Kinect Azure DK 的 RGB + Depth + IR 图像。

    无雨森
  • 经典笔试题-C++篇

    答:for 循环中的变量i 的类型不应定义为vector::size_type, 因为该类型为无符号数值类型,故循环条件将恒成立,为死循环,应将其类型定义为有...

    cwl_java
  • 数组和指针一道非常值得深思的笔试题

    两年前找工作笔试遇到下面这道题,说实话还是挺基础的,虽然当时笔试被我给猜对了,但还是要深究一下具体的转换细节。 题目如下:

    morixinguan
  • MongoDB 分片管理

    一分片一区间:数据不会在片之间自动移动来保持分片的数据的均匀性,需要手动拆分分片来移动数据。

    拓荒者
  • 8-2 图的存储结构

    图结构的元素之间虽然具有“多对多”的关系,但是同样可以采用顺序存储,即使用数组有效地存储图。

    TeeyoHuang
  • 腾讯发布国货美妆报告:它们或成下一个世界级“大牌”

    爱美之心,人皆有之。 随着时代和消费理念的变化,扮靓自己、追求颜值已成为当今各类人群的重要课题之一。 在这一趋势的推动之下,美妆行业也迎来了新变化。 不久前...

    腾讯大讲堂
  • 深度 | 在 R 中估计 GARCH 参数存在的问题

    本文翻译自《Problems In Estimating GARCH Parameters in R 》

    量化投资与机器学习微信公众号
  • MIT教授Tomaso Poggio演讲与专访:智能背后的科学与工程

    导读:3月15日,腾讯AI Lab第二届学术论坛在深圳举行,聚焦人工智能在医疗、游戏、多媒体内容、人机交互等四大领域的跨界研究与应用。全球30位顶级AI专家出席...

    腾讯技术工程官方号

扫码关注云+社区

领取腾讯云代金券