ARVR技术交流群:129340649

欢迎增加。

AR场景往往给别人留下的印象深刻,假设模型做的炫丽一点,效果将会更好。

那么怎样保存这一美好的情景呢?这篇文章将教你怎样实现AR场景的拍摄以及永久保存。

1、AR虚实融合场景图层的分析

一个简单的AR场景,在不论什么系统下的布局方式都不外乎上图所看到的的类型。本文以在Android系统下的增强现实为例。

虚实融合场景图层都是这样的架构,GLSurfaceView用于绘制三维虚拟模型。SurfaceView是显示真实场景视频帧画面,假设使用OpenCV进行图像获取的话,就使用SurfaceView的子类CameraBridgeViewBase。这些布局类的作用应该分的比較清楚。

2、场景获取思路

首先因为真实场景的视频帧画面和三维虚拟模型不在同一个图层上。我们须要分别获取不同图层上的图像,再将它们转换成位图。最后拼合成一张位图图片就能够了。可是传统的拍照方式仅仅能获取真实的场景,无法获取OpenGL渲染的画面。这里就是用传统的方式获取视频图像就可以。主要要解决GLSurfaceView上的三维模型。怎么样将三维虚拟模型转化成一张图片?

3、视频帧图像的获取

在Android系统中。

①使用Camera的情况:
參见这里的方法:Android拍照的两种方式http://blog.csdn.net/napolun007/article/details/6103307
或者參见官网:http://developer.android.com/training/camera/photobasics.html
②使用OpenCV的情况:
     使用OpenCV中的Utils.matToBitmap(Mat mat, Bitmap bmp),将获取的视频帧转换成Bitmap就能够了。

4、OpenGL渲染模型转化成位图

主要是将OpenGL绘制的图像转化成像素数据。了解下glReadPixels參数的含义:
     void glReadPixels( GLint x, GLint y, GLsizei width,GLsizei height, GLenum format, GLenum type, GLvoid *pixels) ;
     前面几个參数指定读取的位置尺寸以及格式, 最后一个參数用来返回结果, 所以像素数据自然是读到pixels中。

最后的方法代码例如以下图所看到的:

// 保存GL绘制的图形
public static Bitmap saveGLBitmap(int width_surface, int height_surface)
{
// isSave = false;
int w = width_surface;
int h = height_surface;Log.i("hari", "w:" + w + "-----h:" + h);int b[] = new int[(int) (w * h)];
int bt[] = new int[(int) (w * h)];
IntBuffer buffer = IntBuffer.wrap(b);
buffer.position(0);
GLES20.glReadPixels(0, 0, w, h, GLES20.GL_RGBA,
GLES20.GL_UNSIGNED_BYTE, buffer);
for (int i = 0; i < h; i++) {
/**
* 因为OpenGL与Android的Bitmap不兼容,这里须要进行一些校正
*/
for (int j = 0; j < w; j++) {
int pix = b[i * w + j];
int pb = (pix >> 16) & 0xff;
int pr = (pix << 16) & 0x00ff0000;
int pix1 = (pix & 0xff00ff00) | pr | pb;
bt[(h - i - 1) * w + j] = pix1;
}
}
Bitmap inBitmap = null;
if (inBitmap == null || !inBitmap.isMutable()
|| inBitmap.getWidth() != w
|| inBitmap.getHeight() != h) {
inBitmap = Bitmap.createBitmap(w, h,
Bitmap.Config.ARGB_8888);
}
// Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
inBitmap.copyPixelsFromBuffer(buffer);
// return inBitmap ;
// return Bitmap.createBitmap(bt, w, h,
// Bitmap.Config.ARGB_8888);
inBitmap = Bitmap.createBitmap(bt, w, h,
Bitmap.Config.ARGB_8888);ByteArrayOutputStream bos = new ByteArrayOutputStream();
inBitmap.compress(CompressFormat.PNG, 90, bos);
byte[] bitmapdata = bos.toByteArray();
ByteArrayInputStream fis = new ByteArrayInputStream(bitmapdata);// final Calendar c=Calendar.getInstance();
// long mytimestamp=c.getTimeInMillis();
// String timeStamp=String.valueOf(mytimestamp);
// String myfile="hari"+timeStamp+".jpeg";File dir_image = new File(Environment.getExternalStorageDirectory()
+ File.separator + "printerscreenshots");
dir_image.mkdirs();try {
File tmpFile = new File(dir_image + "/"
+ System.currentTimeMillis() + ".png");
FileOutputStream fos = new FileOutputStream(tmpFile);byte[] buf = new byte[1024];
int len;
while ((len = fis.read(buf)) > 0) {
fos.write(buf, 0, len);
}
fis.close();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return inBitmap;
}

5、图像的拼合

这个比較简单,就是将两个位图拼合成一幅位图,能够使用Canvas画图板进行绘制。

public static Bitmap combineBitmap(Bitmap background, Bitmap foreground) {if (background == null) {
return null;
}int bgWidth = background.getWidth();int bgHeight = background.getHeight();int fgWidth = foreground.getWidth();int fgHeight = foreground.getHeight();Bitmap newmap = Bitmap.createBitmap(bgWidth, bgHeight, Config.ARGB_8888);Canvas canvas = new Canvas(newmap);canvas.drawBitmap(background, 0, 0, null);canvas.drawBitmap(foreground, (bgWidth - fgWidth) / 2,(bgHeight - fgHeight) / 2, null);canvas.save(Canvas.ALL_SAVE_FLAG);canvas.restore();return newmap;}

6、增强现实场景图像的保存

这个使用传统的文件保存方法就可以。

展示几幅我做出来的效果:

转载于:https://www.cnblogs.com/blfbuaa/p/6834484.html

Android AR场景拍照技术实现(有关键源代码)相关推荐

  1. Android动态加载技术三个关键问题详解

    本文摘选自任玉刚著<Android开发艺术探索>,介绍了Android插件化技术的原理和三个关键问题,并给出了作者自己发起的开源插件化框架. 动态加载技术(也叫插件化技术)在技术驱动型的公 ...

  2. android ar物体识别_拍照救命稻草 AR物体识别崛起_手机生活新闻-中关村在线

    拍照救命稻草 AR物体识别崛起 InfoEye是索尼Xperia Z1中一项非常实用的功能,它脱开简单的拍照功能,将手机当做一双眼睛让智能手机来识别现实中的万物.例如我们在拍摄一张地标性建筑物时,In ...

  3. 扫福得福背后,支付宝 AR 红包的技术创新与故事

    春节期间,支付宝的「扫福得福」活动火爆异常.AR 是一种新的交互方式,与传统营销方式相比,可以使用户更深入地参与互动,给用户带来新体验.而支付宝红包,寄托着用户对未来的期盼,因此其团队就考虑将 AR ...

  4. 扫福得福背后,支付宝AR红包的技术创新与故事

    春节期间,支付宝的「扫福得福」活动火爆异常.AR是一种新的交互方式,与传统营销方式相比,可以使用户更深入地参与互动,给用户带来新体验.而支付宝红包,寄托着用户对未来的期盼,因此其团队就考虑将AR与红包 ...

  5. Android Binder漏洞挖掘技术与案例分享

    本文由作者根据其在KCon 2016黑客大会上的演讲内容整理而成.演讲稿链接:Binder fuzzing based on drozer. 文章开始,先来看几个我在工作生活中发现的Android漏洞 ...

  6. android 获取相机拍照保存到sqlite_OPPO助力谷歌CameraX计划,造福第三方相机应用用户...

    于本月10日,谷歌开发者大会GDD正式开办,如往年一样带来android相关的新鲜技术,而略有不同的是此次在会中谷歌方面就此前I/O 2019中提出的CameraX宣布合作名单,名单中包括有OPPO. ...

  7. 三维重建、视觉定位、传感器位置推算,滴滴 AR 实景导航技术详解

    导读:机场.商场.火车站等大型室内场所内GPS信号不稳定.室内面积大.路线复杂.用户判断方向难等问题,给在大型场所内发单的乘客找上车点带来了很大的挑战,用户急需一种操作简单.交互友好的引导功能.本文讲 ...

  8. Android身份证扫描拍照识别SDK

    Android身份证扫描拍照识别SDK 移动互联网是大趋势? 随着智能手机的硬件不断优化,移动互联网及应用大范围普及,互联网+各行各业,跨界.融合.创新,市场瞬息万变,有野心的企业和人.技术都在拼命的 ...

  9. AR/VR/XR技术简介:探索虚拟与现实的融合

    尝试用chatGPT4生成一系列的科普文章,可以看下质量如何 AR/VR/XR技术简介:探索虚拟与现实的融合 引言 在科技不断发展的今天,人类对于沉浸式体验的需求日益增长.AR(增强现实).VR(虚拟 ...

  10. 光大控股新经济领投智能眼镜研发公司nreal,推动AR、MR“技术-产品-应用”生态体系建设...

    2月26日消息,近日,光大控股新经济完成对"MR智能眼镜"研发公司nreal的A+轮投资.此轮融资由光大控股新经济领投,爱奇艺.华创资本.顺为资本跟投.据悉,本轮融资资金将用于技术 ...

最新文章

  1. JS如何深度复制对象和数组,避免指针变量引用修改值
  2. 浅析C# Dictionary实现原理
  3. 上下班同行有利于婚姻美满?
  4. java学习之单例模式(饿汉式与懒汉式)
  5. Spring Boot (一)Spring Boot 概述
  6. (转) Arcgis for Javascript实现两个地图的联动
  7. 【TI-ONE系列教程(三)】如何使用 TI-ONE 平台内置框架玩转算法大赛
  8. java 获取方法_Java 反射理解(三)-- Java获取方法信息
  9. windows 64 搭建RabbitMQ环境
  10. java中求1 2 =3,1. java dom编程艺术---杨涛、王建桥 -第3章 DOM(自总)
  11. Perl教程-2.环境的安装
  12. Python图像处理之图片文字识别(OCR)
  13. 简单二阶有源滤波电路分析
  14. 网站发布的文章如何快速被收录?
  15. Elasticsearch可视化管理工具dejavu的安装使用
  16. 哈工大计算机学院张宏莉,计算机科学与技术学科博士研究生培养方案2014-哈工大计算机学院.DOC...
  17. CS:APP CH02信息的表示和处理知识点总结
  18. 【make】make常见问题
  19. 输入年份判断是不是闰年
  20. [Java] MVC 编写程序计算净现值 2020.2.25 Java

热门文章

  1. sqlite 检索的字段结果前加空格_MySQL5.7分词全文检索思路
  2. 链接服务器 修改端口号,服务器修改远程链接端口号
  3. springboot注解式AOP通过JoinPoint获取参数 学习笔记
  4. springboot+vue+websocket 消息推送
  5. 计算机名汉字 oracle,修改计算机名对ORACLE的影像
  6. 前端jquery学习
  7. oracle设置保存时间为12或是24小时格式
  8. mysql12260怎么关闭_关于mysql的启动报错处理
  9. ZooKeeper 相关概念以及使用小结
  10. LayaAir 文本 Text API 详解