
3:在系统盘中,循路径找到这个程序文件,右键鼠标,选择“创建快捷方式”,存放到桌面上。
4:回到桌面,右键单击快捷方式,“复制”。然后打开如下文件夹:
系统盘:\Users\用户名\AppData\Roaming\Microsoft\Windows\Network Shortcuts
例如 C:\Users\xiaoyi\AppData\Roaming\Microsoft\Windows\Network Shortcuts (AppData 是隐藏文件夹。如果看不到,请点击“组织”-〉“文件夹和搜索选项”。在“查看”选项卡上点选“显示隐藏的文件、文件夹和驱动器”。)
将快捷方式“粘贴”进来。
5:打开“计算机”,现在就可以看到摄像头图标了。
程序是根据 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的
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)