一、用NDK进行C代码的调取(已熟悉此调取技术)
二、摄像头的获取,这个不能用SDK来调,因为用SDK来调头部跟踪程序很难获得我们的
数据,也不大能考虑AIDL跨进程通信的方案,因为这样数据交互可能太慢。
问题:
头部跟踪移植到Android系统中,跟踪程序需通过核心程序(C实现)调取Camera而不是通过Android SDK进行调取Camera。
前提:
Android的四个层次如下,
一个完成的Android应用,一般都是有Java框架的,虽然NDK(Native Development Kit,一系列工具的集合)提供了一系列的工具,帮助开发者快速开发 C (或 C++ )的动态库,并能自动将 so 和 java 应用一起打包成 apk 。但是NDK 并没有提供各种系统事件处理支持,也没有提供应用程序生命周期维护。此外,在本次发布的 NDK 中,应用程序 UI 方面的 API 也没有提供。至少目前来说,使用纯 C 、 C++ 开发一个完整应用的条件还不完备。所以,就目前来说,必须依赖上层Java框架的支持。
解决方案:
初步考虑有三种方式可以实现:
一、由于Android是运行在Linux上的,所以可以考虑让C程序调V4L2
接口来获取摄像头数据。Video4linux2(简称V4L2),是linux中关于视频设备的内核驱动。在Linux中,视频设备是设备文件,可以像访问普通文件一样对其进行读写,摄像头在/dev/video0下。,不过可移植性差,因为不同厂家的设备驱动接口可能不完全一样,另外也要求开发者熟悉Linux内核编译。
二、SDK获取摄像头数据,再用JNI调C来处理图像,也就是使用JNI来调取跟踪程序并进行数据交互。
三、通过查看Android系统的底层代码,发现Android系统调摄像头也是通过JNI编程来实现的,所以考虑到是否能在JNI调用的Android底层Camera的底层流程中增加一步添加自己的业务逻辑。具体表现在调取Camera之前先启动头像识别程序,让头像识别程序去调Camera设备并获得进行数据交互,比如可以考虑在人像识别中调取android_hardware_Cameracpp。Camera进程机制如下图:
在Android中,Camera的代码主要在以下的目录中:
Camera的JAVA程序的路径:packages/apps/Camera/src/com/android/camera/
在其中Camerajava是主要实现的文件
Camera的JAVA本地调用部分(JNI):
frameworks/base/core/jni/android_hardware_Cameracpp
这部分内容编译成为目标是libandroid_runtimeso
。
Camera底层库在以下的目录中:
frameworks/base/libs/ui/
这部分的内容被编译成库libuiso。
Camera服务部分:
frameworks/base/camera/libcameraservice/
这部分内容被编译成库libcameraserviceso。
为了实现一个具体功能的Camera,在最底层还需要一个硬件相关的Camer库(例如通过调用video for linux驱动程序和Jpeg编码程序实现)。这个库将被Camera的服务库libcameraserviceso调用。
在 Camera系统的各个库中,libuiso位于核心的位置,它对上层的提供的接口主要是Camera类,类 libandroid_runtimeso通过调用Camera类提供对JAVA的接口,并且实现了androidhardwarecamera 类。 libcameraserviceso是Camera的服务器程序,它通过继承libuiso的类实现服务器的功能,并且与libuiso中的另外一部分内容则通过进程间通讯(即Binder机制)的方式进行通讯。
libandroid_runtimeso和libuiso两个库是公用的,其中除了Camera还有其他方面的功能。
特别说明:Camera在模拟器上无法运行,以上所述方案暂时不能做测试,而且底层调取Camera属于系统开发和嵌入开发的范畴,需要的知识面比较广,我也只是在初步研究中,以上所述,如有错误,还请批评指正及包涵。
串口 应该是 tty 吧
比如 下面是 usb转串口的情况
首先,将我的mini2440开发板通过USB转232串口线与PC机连接,这时候咱们的linux系统自动安转了驱动程序,可以使用命令:dmesg 来查看安装驱动的信息,如下图
从上图可以看出咱们的串口设备是0,
你也可以使用命令: ls -l /dev/ttyUSB来查看相关的信息,如下图
至此,我们已经顺利的将串口连接到Ubuntu系统上了,也查看到自己开发板连接的是USB转串口设备/dev/ttyUSB0,如果是普通的串口设备会是/dev/ttyS
说明书上,应该有一个管理摄像头的IP地址,你用网线把摄像头直接连到你电脑上,你在电脑上输入IP地址段与摄像头的管理IP地址段一个网段就可以了。然后在浏览器里输入摄像头的IP地址,就应该可以进入到摄像头的管理界面了。
linux系统下常见的视频编辑软件主要有以下几种:
1Pitivi
PiTiVi是一个使用Python所写并基于GStreamer和GTK的开源视频编辑软件。无论是编辑视频的新手,还是专业人员,皆可通过PiTiVi找到自己的需要。PiTiVi提供一个时间轴,以便对视频实现完全的控制。使用Pitivi,可以捕获音频和视频,对其进行组合、调整大小、切割或者对其应用效果。它允许将项目保存成GStreamer框架支持的任何格式。
2Blender
blender是一个开源的多平台轻量级全能三维动画设计软件,提供从建模,动画,材质,渲染,到音频处理,视频剪辑的一系列动画短片设计解决方案。blender以python为内建脚本,支持yafaray渲染器,同时还内建游戏引擎。
3kino
一个高级视频编辑器,Kino支持以RawDV和AVI格式捕获视频。它可以同时加载多个视频剪辑,剪切和粘贴视频片段并以SMIL和XML格式保存到编辑决定列表。KINO是一个运行在GNU/Linux平台的非线性数字视屏编辑器。她的显著特色:整合了IEEE-1394规范的视屏捕捉,磁带录像机控制和recordingbacktothecamera。她以RawDV或AVI格式捕捉视频到磁盘上,包含type-1DV和type-2DV(声音流分离)两种编码。可以加载多段视频剪辑,剪切和粘贴部分的视频/音频,并可保存成一个decision表单(SMILXML格式)。多数的编辑和浏览命令被映射成vi键盘命令。当然,KINO可以加载各种**、输出合成**,支持的格式众多:从IEEE1394接口采集来的DV、Raw格式的DV、DVAVI、静态帧、WAV、MP3、OggVorbis、MPEG-1、MPEG-2和DivX。静态帧的输出使用了lmlib1,该共享库内置了PPMJPEGPNGTIFFGIF(所以不用理会Magick的安装是否支持);MP3的支持需要lame;OggVorbis需要oggenc;MPEG-1、MPEG-2、DivX需要mjpegtools160。RPM、Deb包和源码(tarballs)都可获得。
4Cinelerra
Cinelerra是适合Linux系统所用的一个功能丰富的视频编辑软件。它为用户提供从视频捕捉到视频合成、并包含音频和视频编辑等全套的功能。它具有火线输入/输出、渲染集群、以及支持HDTV格式等特性。如果你需要在Linux中进行有关视频编辑的工作,Cinelerra则值得一用。
5Avidemux
Avidemux是一个视频编辑器,可以编辑、剪切、编码、量化视频。支持AVI、MPEG、MP4、ASF格式。能将声音从视频中分解出来并支持强大的队列任务处理和脚本功能。
支持多平台包括Mac、Windows、Linux。
6Kdenlive
Kdenlive是一款合用于KDE桌面情况的非线性视频编辑软件。它基于MLT视频框架而构建,具有多轨编辑,支撑普遍的音频、视频以及图像文件花样,并预设了一些音频、视频和转场成就等功用。
7VirtualDub
VirtualDub是一套免费的多媒体剪辑软件,但它的功能可一点也不输给Premiere以及MediaStudio等专业等级产品的功能。在VirtualDub中主要的功能可以区分为两大部份,一是可以让您针对现有的**短片文件如AVI以及MPG等做编辑的工作,另一项则是可以搭配您的影像捕捉卡做即时的动态影像捕捉的功能。
8zs4
ZS4是一款免费的影音剪辑软件,它能够让使用者输入与音乐文件,合成为影片。让你的生活记录更加生动。而它当然不仅是这样的功能,使用者还可以用它来剪辑各种影片中想要的片段,例如**片段、或是通过DV拍下的生活点滴,而这些影片片段,当然也可以通过ZS4来进行合成,让使用者将不同的影片片段组合成一部内容丰富的小短片。
ZS4的使用方式也相当简单,它是采用时间线的方式来进行编辑的,让使用者能够把影片、声音或是加入时间滚动条中的任一个时刻,并且设定播放的速度以及时间间隔,如此就能完成一部影片了。此外,ZS4提供预览功能,让使用者能够一边编辑一边观看新加入的内容对整部影片的影响,不需要等到输出成品后感到不满意才又重新返工!
9Celtx
Celtx是用于编辑和视频proctionInlge通过**,录像,戏剧,动画等完整的工具的创新精神。它让位给故事,plásmalas的,添加音轨或任何类型的音频文件,视频剪辑。所有的多媒体的可能性在指尖感谢Celtx的。该方案具有所有必要的工具,确保人员没有发现任何限制workSincecompletísimos文本编辑器写小说,诗歌或剧本或详细的说明,注册传呼paginacións工具,脚本,场景管理,注意,还有更多。在视觉效果上也agendaIn此外,如果项目中,我们工作是非常漫长而复杂的,Celtx可以自动创建一个数据库,其中包含的所有信息,计划和在一个特殊的日历为此同一日期。此外,多语种界面,在不低于20种语言,包括西班牙语。
10Lives
LiVES是一个简单易用但功能强大的视频效果,编辑,转换和播放软件。它使用现有普通工具(MPlayer的,Magick的,和GTK),因此它可以在大多数的Unix类系统。它运行的Linux,BSD,MacOSX中/Darwin文,IRIX上openMosix。这是和抽样准确,可以处理几乎所有类型的视频,并完全通过插件和扩展,包括插件的建设者的工具。它也可以使用OSC被远程控制。
将 CtsVerifierapk 安装到设备上, 连接上linux主机。
基础:CTS测试运行环境
然后,主机安装python27,及numpy/scipy/matplotlib/opencv 栈和 python 成像库。按照下面的命令依次安装:
sudo apt-get install python-numpy
sudo apt-get install python-scipy
sudo apt-get install python-matplotlib
sudo apt-get install python-opencv
安装完成后,检查环境是否配置成功: build/envsetupsh
如下图,环境配置成功
1、测试场景:
ITS测试共有以下6个场景:
●Scene 0: No requirements The camera camera be pointing at anything (including being face down on the desk, or using the same setup as scene 1)
场景 0 : 无要求。相机摄像头指向任何东西 (包括脸朝下, 或使用与场景1相同的设置)。
●Scene 1: The camera is on a tripod pointing at a static scene containing a grey card and white background, under a constant (stable) relatively bright illumination source This is the scene that is described above for the CTS Verifier physical setup
场景 1 : 相机位于三脚架上, 指向一个静态场景, 其中包含灰色卡和白色背景, 在恒定 (稳定) 相对明亮的光照源下。这是 CTS 验证程序物理设置上面描述的场景。
镜头视野中,灰卡大致放在中间,周围为白色背景。
●Scene 2: This is the scene for testing face detection The camera is on a tripod pointing at a static picture containing 3 human faces, under a constant (stable) relatively bright illumination source
场景 2 : 这是测试人脸检测的场景。相机位于三脚架上, 指向一张包含3人脸的静态, 在恒定 (稳定) 相对明亮的照明光源下。
镜头视野中,照片放在中间,基本占据所有视野(周围可以有一点白色背景)。
●Scene 3: This is the scene for testing image sharpness The camera is on a tripod pointing at a static picture containing some edges, such as a printed ISO 12233 chart The scene should be under a constant (stable) relatively bright illumination source
场景 3 : 这是测试图像清晰度的场景。相机位于三脚架上, 指向包含某些边缘的静态, 如打印的 ISO 12233 图表。现场应在一个恒定 (稳定) 相对明亮的照明源。
镜头视野中,ISO 12233图表放在中间,基本占据所有视野(周围可以有一点白色背景)。
●Scene 4: This is the scene for testing aspect ratio The camera is on a tripod pointing at a static test page containing a black circle and a square box The scene should be under a constant (stable) relatively bright illumination source
场景 4 : 这是测试纵横比的场景。相机位于三脚架上, 指向一个静态测试页, 其中包含一个黑色圆圈和一个方块。现场应在一个恒定 (稳定) 相对明亮的照明源。
镜头视野中,图纸放在中间,基本占据所有视野(周围可以有一点白色背景)。
●Scene 5: This is the scene for testing lens shading and color uniformity A diffuser is placed in front of the camera The camera is on a tripod pointing at a constant (stable) relatively bright illumination source
场景 5 : 这是测试镜头着色和颜色均匀性的场景。在摄像机前放置一个扩散器。相机位于三脚架上,指向恒定的 (稳定) 相对地明亮的照明源。
我们这边就用的一张白色餐巾纸代替了扩散器,将镜头对着光源,用餐巾纸挡住镜头即可。下图为官方文档,使用扩散器挡住镜头的示意图。
●Scene Infinity: This scene is to test infinite focus mode The camera is on a tall tripod pointing at a large printed ISO 12233 chart The chart should be printed at 126x80cm and mounted The camera needs to be the hyperfocal distance away from the chart ~35m, depending upon the lens The scene should be under a constant, relatively bright illumination source The ISO12233pdf file is included for printing
场景无穷 : 此场景是测试无限焦点模式。相机是在一个高大的三脚架指向一个大型印刷 ISO 12233 图表。图表的要打印在126x80cm 和安装。照相机需要是 hyperfocal 距离从图表 35 m, 取决于透镜。现场应在一个恒定的, 相对明亮的照明源。ISO12233 文件包括用于打印。
该场景要求较高,目前我们这边的项目还没有测过,有的项目这个场景开始测试后,会自动跳过。
进入CameraITS目录: cd android-cts-verifier/CameraITS/
检查环境:主机端 build/envsetupsh
手机端 打开CtsVerifierapk,点开Camera测试中的CameraITS测试(每次运行测试命令是,手机选必须进入这个界面)
测试Camera 0,Scene 0 :环境无要求,运行命令测试 python tools/run_all_testspy camera=0 scenes=0
等待测试结束,手机端Camera:0,scene0 这一项变成绿色,及通过,可以测试下面的测试项。
测试Camera 0,Scene 1 :物理环境如上文要求,运行命令测试 python tools/run_all_testspy camera=0 scenes=1
等待测试结束,手机端Camera:0,scene1 这一项变成绿色,及通过,可以测试下面的测试项。
以此类推 ,测试完所有相机的所有场景,测试界面的绿色圆形按钮及高亮,可以点击pass。
ps:Scene 1的测试时间会稍微久一点,大概十几分钟,请耐心等待,主机端可以看到测试进程。
以上就是关于Android 开发,使用ndk调用v4l2来读取Android摄像头的数据靠谱吗全部的内容,包括:Android 开发,使用ndk调用v4l2来读取Android摄像头的数据靠谱吗、linux下的怎么连接单目相机、Linux中怎么打开cameraViewer等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)