在工作中需要将摄像头的摄像头的视频流数据转为YUV
格式,供算法去处理图像,为了方便调试就将每帧数据又转成了Bitmap
去显示,效果如下:
起初,看到画面正常显示后,就没太在意图像的内容,直到看见蓝色瓶的可口可乐(实际是红色的),事情好像不太对,后续发现所有红色的东西在画面中都变成了蓝色,然后算法识别的结果也不太好,才发现了问题的严重性。
Bitmap
转换问题?好像不是,yuv
数据有问题?是直接从摄像头视频流解码出来的啊!总不能是摄像头有问题吧!看了摄像头预览效果正常的。头大,直到在网上看到:
UV排列反了。
比如说,NV21和YUV420SP的Y排列相同,UV则相反。给你YUV420SP,你当作NV21保存JPG,就会 发生红蓝颠倒。
抱着试试的态度,那就把UV转换以下看看把,原神,启动!
正常了,好神奇,哈哈哈。
就简单记下吧,部分代码如下,从解码到转Bitmap
。
fun decode(data: ByteArray, offset: Int, length: Int) {
val inputBuffers = codec?.inputBuffers
val outputBuffers = codec?.outputBuffers
val inputBufferIndex = codec?.dequeueInputBuffer(10000) ?: -1
if (inputBufferIndex >= 0) {
val inputBuffer = inputBuffers?.get(i