最近有个需求,要用android 来驱动外部usb摄像头。emmmmmmm...... 港真,突然听到这么个需求,有点蒙~~于是google github转有没有类似需求的文章。诶嘿 还真有。 还有开源的项目。项目地址:传送门。
事前要检测摄像头是不是好用。这个apk能直接驱动usb摄像头。 下载链接: 传送门 。但是这个apk找不到源码诶。
接下来就按照readme中的介绍开始测试demo。好久不用eclipse啦 就只用android studio(AS)做的测试
1.git或者直接下载zip 把源码搞到本地。然后用AS打开项目。划重点了。。项目要配合NDK。ndk的配置方法大家自行搜索,本文就不在多说这块内容。
在AS内打开项目后。会有多个usbCameraTest 的module。 每个mudule 里面有不同的内容,拍照、 视频、设置亮度等等。但是一般能拿到摄像头的预览内容 剩下的都好说了。
2.接下来 随便run个module 开始测试能不能驱动自己的测试摄像头。我选的usbCameraTest3来做的测试。
期间遇到的问题
1.ndk版本要用r14 的如果用其他版本的会有各种莫名其妙的问题。用r14版本就稳了。我用的是r14b的版本。下载地址:传送门。
2.点击页面上的开关button 报错 could not open camera:err=-1 。 在libuvccamera/src/main/jni/Application.mk 中 将NDK_TOOLCHAIN_VERSION := 4.9 的注释放开后,重新编译。
3.再次点击页面上的开关button。页面还不出preview。依旧一片黑。咋子个问题哦。。这时候 注意logcat里面的输出问题。
这是摄像头支持的分辨率,但是在java代码中默认设置的是:
这项目中默认的 宽高比好像和摄像头支持的不一样诶。emmm 是真的不一样。将项目中的宽高比改为摄像头支持的随便一组。再次尝试运行~~~~。bingo~~preview成功出来了。。撒花撒花。
等等等等~~
preview确实出来了。但是需求可不是单单纯纯的看就完事儿了。。我们需要视频的二进制流来做图像处理才行啊。
在源码中继续翻。在AbstractUVCCameraHandler 类中 找到了
曙光就在眼前了。将这ByteBuffer 转成byte[] 。 做图像的基本数据格式就满足了。将该方法改造下。放到自己需要的地方做个回调。需要的数据就出来了。
我是用着数据做人脸分析的。把数据放进去 图像中其实是有人脸的,但是分析人脸的接口返回的数据是没人脸。。。。。。脑袋一晃 发现这事儿没这么简单。 人脸识别的api 需要 二进制流的灰度图(NV21格式数据)。但是摄像头出的数据是不是NV21格式的呢???? 在AbstractUVCCameraHandler 类中。
哇 真滴是 ~~~找这设置图像输出格式真是费了老鼻子劲儿了。在这设置成NV21 格式就好了。
在这还有个坑。第一家人脸识别sdk用 YUV420SP格式的输出数据能做识别。第二家人脸识别sdk就需要NV21 格式的了。在次 用usb摄像头做识别的同学要注意了。
到此~~需求的基本内容算是搞定了。。。奖励自己下 晚饭加个肯德基手枪腿!!
网友评论