问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

UVC Camera使用简单记录

发布网友 发布时间:2022-11-26 19:52

我来回答

1个回答

热心网友 时间:2023-10-12 09:47

程序是根据 UVCCamera 去修改的。
使用过程中遇到的几点关键问题:
1.YUV 格式:NV21等格式。
2.YUV转RGB效率问题。
3.Bitmap内存泄漏问题。
4.Handler内存泄漏的问题

首先onFrame(这是camera取图的callBack函数,byte[] data就是camera的数据)中不能做耗时操作(例如将data转bitmap等操作),不然会阻塞(之前把这个操作放到这里然后直接将bitmap传出)导致卡顿。

在传输byte[]数据之后,需要将byte[]转bitmap。
在byte[] 转bitmap的过程中,由于创建了过多的Bitmap,会导致内存泄漏,程序崩溃。
因此1.将Bitmap设置为静态变量,避免重复创建的问题。2.修改byte[] 转bitmap的函数,原来函数是返回Bitmap,现在是将Bitmap作为参数传入函数中,直接将Bitmap数据传递出去。减少了一个返回的步骤。

之前是这样的:

现在是这样的:

后面就是通过handleImage将Bitmap显示在ImageView上。

NV21转bitmap的问题。
我的程序基本是根据 UVCCamera 去修改的,UVCCamera中没有取每一帧,但是留有接口,我这里设定每一帧的数据为NV21格式。

并且在onFrame中取出的data格式是NV21(NV21是YUV中的一个,YUV有很多格式),因此在转成bitmap的时候,需要根据公式去转化。用系统自带的RenderScript去转换,发现图片虽然清晰但是颜色不对。

查找yuv转bitmap函数,找到的是这个。依旧是转出来的图片,非常明显,成像很清晰,但是就是颜色不对。

因此对函数进行了修改。修改后如下所示。

由于对YUV与RGB这个概念模糊不清,而搜索得到的YUV转bitmap函数是虽然的确是NV21转bitmap,但转换后有色差。后修改rgba[]的赋值顺序后,颜色才正常。其实就是在由YUV编码转RGB编码的过程中,数据传递出现问题才导致色彩异常,这种情况就需要一步步分析YUV到RGB的数据转换中哪里出现了问题。之前是存储为ABGR,后面才是存储为ARGB。
具体分析可以看这篇:
RGB和YUV简单学习记录

但是上面这种方式实际使用中发现效率过低。因此需要使用so的方式去转换。

具体参考链接:
libyuv—libyuv测试使用ARGBToI420和ConvertToARGB接口
https://blog.csdn.net/XIAIBIANCHENG/article/details/73065646

但是这个是yuvI420 数据转为bitmap 。我在使用的时候需要对format进行修改。

即将void Java_com_example_libyuv_Test_convertToArgb函数中的FOURCC_IYUV改为FOURCC_NV21。

Handle内存泄漏的问题。
之前因为想偷懒所以没有处理Android studio关于Handle内存泄漏的提示。然后让程序跑了一天果然崩了。

之前是如下所示,这种写法Android Studio会提示你这是有风险的。

现在改成如下所示

其实还可通过在activity的destroy中调用 handler.removeCallbacksAndMessages(null) ,来达到避免内存泄漏的目的,android 系统源码中也基本是使用这个方法。

后记:这篇文章始于2018年,当时是用于双目USB摄像头上,最近在整理东西所以完善了一下。
参考链接:
Android yuv转换成bitmap
图文详解YUV420数据格式
Android中的YUV格式解析
Nv21转Bitmap(高效率转化)
Android 之 Bitmap
Android解惑之Handler为什么需要是static的
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
手机导航用电脑软件哪个好导航软件哪个最准确 我要地图网使用我要地图网轻松查询地图信息 装配行业MES系统四大车间管理活动介绍 王者荣耀S14狂铁怎么玩_王者荣耀S14狂铁出装铭文推荐 沅陵县有姓文的分布在那个地方, 汨罗一中在省排名 汨罗高中有哪些? 湖南省岳阳市汨罗有哪些高中 新生儿脊膜膨出后遗症 在深圳硬脊膜膨出手术后大小便失禁怎么办? Android-DialogFragment内存泄露最强解决方案 Android面试 Handler机制 纪梵希水乳合一有用过的吗?效果怎么样?用它还用水和乳吗? 内蒙古公务员面试技巧 买的二手萤石云台摄像机,已被别人添加绑定过了,如何解绑,设备己被别人*如何解除找不到原来主人? 胳膊,腿说疼就疼详细原因是什么? 请问小腿和胳膊痛什么原因 飞利浦32pff5101 t3 32英寸硬屏1080p智能平板液晶电视机怎么样 飞利浦32英寸智能液晶电视机32PFL5040T3 内置WIFI网络怎么样 男子因工作问题憋尿一天后昏倒,憋尿会带来什么危险? 医生飞机上用嘴帮老人吸尿感动全网,但是此举会有染病的风险吗? 尿毒症今天刚拔的引尿袋排不出尿,过了3小时喝了1500毫升的水,12小时内排不出尿会有生命危险吗? 日记2008年12月23日星期二 10月4日日记星期二雨天怎么写 抖音刷关注页是什么意思 小米9省流量模式在哪里关闭? daretoleap是什么手机 温控器制冷用英语怎么说 王者荣耀亲密关系解除了还能重建吗 王者荣耀亲密关系解除了还能重建 求大神解答 刚换硬盘重装了系统 但是引导盘还在老硬盘上 内存泄露作业 工作手麻了怎么办 医生我干活后两只手麻是怎么回事 非全日制研究生可以和全日制研究生一起报考吗? 干活的时候手麻的疼,怎么回事 想去做韩式半永久,想问问眉毛稀疏可以做根状眉吗 丷怎么读 丷如何读 丷读作什么 sqlserver一些简单问题 生日红包是工资的多少 新工作第一次发工资,想跟领导发个红包,发几元钱可以吗? 炒紫甘蓝要先用水焯吗 炒紫甘蓝要不要先用水焯 18周胎儿双顶径标准 孕18周双顶径多少正常值是多少 怀孕18周胎儿双顶径标准值多少正常 滑板更像是一场长达10年的梦 滑板车放到彩虹上比喻成什么 吉利星越怎么样值得买吗 吉利星越_2022款怎么样 北京市丰台区大王庙至香山换乘路线?