ndroid Camera2采集摄像头原始数据并手动预览
2018-02-03 19:33
218 查看
ndroid Camera2采集摄像头原始数据并手动预览
最近研究了一下android摄像头开发相关的技术,也看了Google提供的Camera2Basic调用示例,以及网上一部分代码,但都是在TextureView等预览基础上实现,而我想要做的是在不预览的情况下,能获取到摄像头原始数据流,并由自己来决定是否绘制显示。经过一番折腾,初步实现了自己的目的——CamCap程序。
需求分析
其实主要就是在不预览的情况下获取到摄像头原始数据,目的嘛,一是为了灵活性,方便随时开启关闭预览,二是为了以后可以直接对数据进行处理,三是为了其他程序开发做一些准备。于是实现一下几个功能:
获取摄像头数据,并手动绘制图像
随时开启/关闭预览
随时保存当前摄像头图像,即使在关闭预览情况下
Android Camera2接口
查阅了一些资料,Android Java层由于从API21开始,已经废弃原Camera接口,所以这里采用Camera2接口。相比Camera接口来说,第二代摄像头接口,调用复杂多了,但是灵活性也更高了,通过Google的Camera2Basic例子可以很清楚的了解到使用方式。这里把CamCap程序中的Camera2的调用顺序整理如下:
和其他程序一样,通过ImageReader来获取到CameraCaptureSession传递出来的数据,与Google例子不同的是,我取消了把TextureView的传递,改为单独以ImageReader来获取图像流,并设置为YUV_420_888格式,以拿到原始数据。
打开摄像头
摄像头打开后,创建对话
调用libyuv做RGB之间的数据转换
获取到YUV数据之后,就可以在UI界面上进行绘制了,通过简单了解,可以通过OpenGLES来绘制,也可以转为Bitmap直接在TextureView上绘制。这里为了简单,选择了后者。然而后来发现,android.graphics.Bitmap并不支持直接将YUV数据存入,只能转为RGB数据格式,才能存入Bitmap,进而在TextureView上绘制。YUV转换RGB,之前在C++上应用过很多次了,可以把现有代码修改一下放到java里运行,不过考虑到性能问题,决定还是使用libyuv。libyuv是一款以c/c++为基础的,专做YUV与RGB格式转换的开源项目,性能非常高。
使用libyuv,需要通过NDK交叉编译,并通过JNI来调用。libyuv编译起来也很简单,首先下载libyuv源码,代码地址是:https://chromium.googlesource.com/libyuv/libyuv 。然后确保NDK已经安装(这个直接在AndroidStudio中就能安装好),之后把NDK目录添加到环境变量。最后,进入libyuv目录,调用ndk-build即可。libyuv项目里已经写好了Android.mk,所以,直接编译就行了(我是在Windows上)。
注意!编译的时候遇到JPEG库没有指定的问题,如果不想依赖libjpeg,可以修改Android.mk,删除JPEG库相关编译项就可以解决。
在AndroidStudio上建立c++文件,封装libyuv接口,然后按照JNI规范暴露接口,同时在Java层封装类来调用native方法。
绘制图像
在绘制图像的时候,有个坑,那就是图像的旋转,这个是由于手机上的摄像头传感器的视野坐标,一般都是旋转了90度或270度的,所以,需要把摄像头采集到的画面,进行旋转,才能还原出正确的视野画面。传感器旋转方向通过以下值获得,
CameraManager.getCameraCharacteristics(camid).get(CameraCharacteristics.SENSOR_ORIENTATION)
根据这个值,构建Matrix将Bitmap进行旋转
Matrix构建代码如下:
与上面代码中类似,通过TextureView.lockCanvas(),获取到Canvas,调用drawBitmap()将图像写入,即可完成绘制。
运行截图
开启预览时的4:3画面和16:9画面
关闭预览,同时可以继续拍照
$ kubectl get all --namespace www.tkcyl1.com/ openfaas-fn
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
deploy/figlet 1 1 1 1 8m
NAME
4000
DESIRED CURRENT READY AGE
rs/figlet-676c995d66 1 1 1 8m
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
deploy/figlet 1 1 1 1 8m
NAME DESIRED CURRENT READY AGE
rs/figlet-676c995d66 1 1 1 8m
NAME READY STATUS RESTARTS AGE
po/figlet-676c995d66-rqjpn 1/1 Running 0 8m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
svc/figlet ClusterIP 10.101.45.157 8080/TCP 8m
相对于Docker Swarm,Kubernetes使用更多对象形成服务。
激活服务查看结果:
作业运行很顺畅,而且简单易用。对于社区维护和内置OpenFaaS整合很有帮助。
之前提过需要helm(一个类似OpenFaaS的分布式软件管理器),在Docker Swarm中没有类似的概念。
写这篇博客之前,我在Twitter上看有消息说helm也已经被支持了。
总结
其实不仅是简单的DfM整合了“栈”,应该说在现有工具外层实现了简单化,提高了速度,更加易用。相信Docker Swarm用户都会使用这种整合,而且迁移到Kubernetes。
Docker Swarm 已死?作为Docker Captains用户组成员,我并没有更多内部消息,但是因为Docker Swarm仍然有很多用户,因此仍然会被支持。例如:最原始可以运行在容器内的Swarm仍然被Docker's UCP product[4]支持。
如果读了developer reactions on Hacker News[5],可以看到Swarm仍然有很多粉丝,如果Kubernetes想吸引他们,那么on-prem安装维护过程需要提高。
因此我的第一印象总结如下:很多新功能令人振奋,尤其是对DfM的更新以及内部新元素使得它看起来更像一个LinuxKit了。
相关链接:
https://www.docker.com/docker-mac
https://www.vagrantup.www.huachenj157.com com/
https://github.com/ahmetb/kubectx
https://docs.www.douniu178.com docker.com/datacenter/ucp/2.2/guides/
https://news.www.688qusheng.cn ycombinator.com/item?id=16084243
最近研究了一下android摄像头开发相关的技术,也看了Google提供的Camera2Basic调用示例,以及网上一部分代码,但都是在TextureView等预览基础上实现,而我想要做的是在不预览的情况下,能获取到摄像头原始数据流,并由自己来决定是否绘制显示。经过一番折腾,初步实现了自己的目的——CamCap程序。
需求分析
其实主要就是在不预览的情况下获取到摄像头原始数据,目的嘛,一是为了灵活性,方便随时开启关闭预览,二是为了以后可以直接对数据进行处理,三是为了其他程序开发做一些准备。于是实现一下几个功能:
获取摄像头数据,并手动绘制图像
随时开启/关闭预览
随时保存当前摄像头图像,即使在关闭预览情况下
Android Camera2接口
查阅了一些资料,Android Java层由于从API21开始,已经废弃原Camera接口,所以这里采用Camera2接口。相比Camera接口来说,第二代摄像头接口,调用复杂多了,但是灵活性也更高了,通过Google的Camera2Basic例子可以很清楚的了解到使用方式。这里把CamCap程序中的Camera2的调用顺序整理如下:
和其他程序一样,通过ImageReader来获取到CameraCaptureSession传递出来的数据,与Google例子不同的是,我取消了把TextureView的传递,改为单独以ImageReader来获取图像流,并设置为YUV_420_888格式,以拿到原始数据。
打开摄像头
摄像头打开后,创建对话
调用libyuv做RGB之间的数据转换
获取到YUV数据之后,就可以在UI界面上进行绘制了,通过简单了解,可以通过OpenGLES来绘制,也可以转为Bitmap直接在TextureView上绘制。这里为了简单,选择了后者。然而后来发现,android.graphics.Bitmap并不支持直接将YUV数据存入,只能转为RGB数据格式,才能存入Bitmap,进而在TextureView上绘制。YUV转换RGB,之前在C++上应用过很多次了,可以把现有代码修改一下放到java里运行,不过考虑到性能问题,决定还是使用libyuv。libyuv是一款以c/c++为基础的,专做YUV与RGB格式转换的开源项目,性能非常高。
使用libyuv,需要通过NDK交叉编译,并通过JNI来调用。libyuv编译起来也很简单,首先下载libyuv源码,代码地址是:https://chromium.googlesource.com/libyuv/libyuv 。然后确保NDK已经安装(这个直接在AndroidStudio中就能安装好),之后把NDK目录添加到环境变量。最后,进入libyuv目录,调用ndk-build即可。libyuv项目里已经写好了Android.mk,所以,直接编译就行了(我是在Windows上)。
注意!编译的时候遇到JPEG库没有指定的问题,如果不想依赖libjpeg,可以修改Android.mk,删除JPEG库相关编译项就可以解决。
在AndroidStudio上建立c++文件,封装libyuv接口,然后按照JNI规范暴露接口,同时在Java层封装类来调用native方法。
绘制图像
在绘制图像的时候,有个坑,那就是图像的旋转,这个是由于手机上的摄像头传感器的视野坐标,一般都是旋转了90度或270度的,所以,需要把摄像头采集到的画面,进行旋转,才能还原出正确的视野画面。传感器旋转方向通过以下值获得,
CameraManager.getCameraCharacteristics(camid).get(CameraCharacteristics.SENSOR_ORIENTATION)
根据这个值,构建Matrix将Bitmap进行旋转
Matrix构建代码如下:
与上面代码中类似,通过TextureView.lockCanvas(),获取到Canvas,调用drawBitmap()将图像写入,即可完成绘制。
运行截图
开启预览时的4:3画面和16:9画面
关闭预览,同时可以继续拍照
$ kubectl get all --namespace www.tkcyl1.com/ openfaas-fn
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
deploy/figlet 1 1 1 1 8m
NAME
4000
DESIRED CURRENT READY AGE
rs/figlet-676c995d66 1 1 1 8m
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
deploy/figlet 1 1 1 1 8m
NAME DESIRED CURRENT READY AGE
rs/figlet-676c995d66 1 1 1 8m
NAME READY STATUS RESTARTS AGE
po/figlet-676c995d66-rqjpn 1/1 Running 0 8m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
svc/figlet ClusterIP 10.101.45.157 8080/TCP 8m
相对于Docker Swarm,Kubernetes使用更多对象形成服务。
激活服务查看结果:
作业运行很顺畅,而且简单易用。对于社区维护和内置OpenFaaS整合很有帮助。
之前提过需要helm(一个类似OpenFaaS的分布式软件管理器),在Docker Swarm中没有类似的概念。
写这篇博客之前,我在Twitter上看有消息说helm也已经被支持了。
总结
其实不仅是简单的DfM整合了“栈”,应该说在现有工具外层实现了简单化,提高了速度,更加易用。相信Docker Swarm用户都会使用这种整合,而且迁移到Kubernetes。
Docker Swarm 已死?作为Docker Captains用户组成员,我并没有更多内部消息,但是因为Docker Swarm仍然有很多用户,因此仍然会被支持。例如:最原始可以运行在容器内的Swarm仍然被Docker's UCP product[4]支持。
如果读了developer reactions on Hacker News[5],可以看到Swarm仍然有很多粉丝,如果Kubernetes想吸引他们,那么on-prem安装维护过程需要提高。
因此我的第一印象总结如下:很多新功能令人振奋,尤其是对DfM的更新以及内部新元素使得它看起来更像一个LinuxKit了。
相关链接:
https://www.docker.com/docker-mac
https://www.vagrantup.www.huachenj157.com com/
https://github.com/ahmetb/kubectx
https://docs.www.douniu178.com docker.com/datacenter/ucp/2.2/guides/
https://news.www.688qusheng.cn ycombinator.com/item?id=16084243
相关文章推荐
- ndroid Camera2采集摄像头原始数据并手动预览
- ndroid Camera2采集摄像头原始数据并手动预览
- ndroid Camera2采集摄像头原始数据并手动预览
- ndroid Camera2采集摄像头原始数据并手动预览
- ndroid Camera2采集摄像头原始数据并手动预览
- ndroid Camera2采集摄像头原始数据并手动预览
- ndroid Camera2采集摄像头原始数据并手动预览
- ndroid Camera2采集摄像头原始数据并手动预览
- ndroid Camera2采集摄像头原始数据并手动预览
- ndroid Camera2采集摄像头原始数据并手动预览
- Android Camera2采集摄像头原始数据并手动预览
- [置顶] 《android多媒体api》之摄像头camera采集原始视频数据
- Camera2.0新API下的摄像头预览、原始图像数据获取等
- Android Camera2采集摄像头原始数据
- 用CxImage将从摄像头获取的图像原始数据转成JPG
- Android中直播视频技术探究之---摄像头Camera视频源数据采集解析
- FFMPEG采集摄像头数据并切片为iPhone的HTTP Stream流
- 直接访问摄像头的原始数据
- ROS&OpenCV进行摄像头数据的采集与订阅发布
- 通过摄像头设备采集一帧数据的例子程序(完整版)【转】