HAL层Camera模块Dump图片--工作积累
Camera的raw data一般都是YUV420的格式,数据的特点是:
YUV 4:2:0采样,每四个Y共用一组UV分量
YUV420格式:
先Y,后V,中间是U。其中的Y是w * h,U和V是w/2 * (h/2)
如果w = 4,h = 2,则:
yyyy
yyyy
uu
vv
内存则是:yyyyyyyyuuvv
需要占用的内存:w*h(Y占用内存大小) + w * h/4(U占用内存大小) + w * h/4(V占用内存大小) = w*h * 3 / 2
所以YUV420 数据在内存中的长度是 width * hight * 3 / 2,YUV420包括:YUV420p和YUV420SP两种格式
假设一个分辨率为8X4的YUV图像,它们的格式如下图:
YUV420sp格式如下图
YUV420p数据格式如下图
采样规律是:每个像素点都采样Y,寄数行采样1/2个U,不采样V,偶数行采样1/2个V,不采样U
以640x480_420.yuv为例,正确的存储格式为一大片Y,跟着一大片U,最后是一大片V:
-------------------------640x480 point
Y(0,0) Y(0,1)... Y(0,639)
...
Y(479,0) Y(479,1)... Y(479,639)
-------------------------640x480 point
-------------------------320x240 point
U(0,0) U(0,1)... U(0,319)
...
U((239,0) U((239,1)... U((239,319)
-------------------------320x240 point
-------------------------320x240 point
V(0,0) V(0,1)... V(0,319)
...
V((239,0) V((239,1)... V((239,319)
-------------------------320x240 point
yuv420p 和 YUV420的区别 在存储格式上有区别
YUV420P,Y,U,V三个分量都是平面格式,分为I420和YV12。I420格式和YV12格式的不同处在U平面和V平面的位置不同。在I420格式中,U平面紧跟在Y平面之后,然后才是V平面(即:YUV);但YV12则是相反(即:YVU)。
YUV420SP, Y分量平面格式,UV打包格式, 即NV12。 NV12与NV21类似,U 和 V 交错排列,不同在于UV顺序。
I420: YYYYYYYY UU VV =>YUV420P
YV12: YYYYYYYY VV UU =>YUV420P
NV12: YYYYYYYY UVUV =>YUV420SP
NV21: YYYYYYYY VUVU =>YUV420SP
导出YUN420数据进行调试,先写Y(w*h),再写UV(w * h/4(U占用内存大小) + w * h/4(V占用内存大小)),分析问题:
// dump图像数据 事列
void dump(const int width, const int height, void *yBuf, void *uvBuf)
{
char buf[] = {'\0'};
FILE* file_fd = fopen(buf, "wb");
snprintf(buf, sizeof(buf), "/data/Effect/%dx%dvideodenoiser%d.yuv",width,height,);
file_fd = fopen(buf, "wb");
if (file_fd != NULL) {
void *data = NULL;
int written_len = ;
data = (void *)((uint8_t *)yBuf);
written_len += fwrite( data, width*height, , file_fd);
if(NULL == uvBuf)
data = (void *)((uint8_t *)yBuf+ width*height);
else
data = (void *)((uint8_t *)uvBuf);
written_len += fwrite( data, width*height/, , file_fd);
fclose(file_fd);
TSLOG("%s: dump-------sucess%d",__func__,);
} else {
TSLOG("%s: fail t open file for image dumping", __func__);
}
备注:
YUV420P,Y,U,V三个分量都是平面格式,分为I420和YV12。I420格式和YV12格式的不同处在U平面和V平面的位置不同。在I420格式中,U平面紧跟在Y平面之后,然后才是V平面(即:YUV);但YV12则是相反(即:YVU)。
YUV420SP, Y分量平面格式,UV打包格式, 即NV12。 NV12与NV21类似,U 和 V 交错排列,不同在于UV顺序。
I420: YYYYYYYY UU VV =>YUV420P
YV12: YYYYYYYY VV UU =>YUV420P
NV12: YYYYYYYY UVUV =>YUV420SP
NV21: YYYYYYYY VUVU =>YUV420SP
最新文章
- php 通过curl post发送json数据实例
- gettimeofday() 获取系统时间,精确到微秒 这个似乎只能在linux 下用,不能在windows 下用
- xml复习
- php生成批次唯一code(转)
- swift 点击button改变其内填充图片,达到选中的效果
- 再探java基础——break和continue的用法
- PHP初入--添加内容到框框里并删除
- 【adb】连接BlueStacks
- 解决 react-router / react-router-dom v4 history不能访问的问题
- 在spring中实现quartz2.2.1的动态调度(开始、暂停、停止等)
- ML: 降维算法-LE
- java多线程——线程池源码分析(一)
- 简单叨叨bootstrap按钮无限层级下拉菜单的实现
- Dubbo -- 系统学习 笔记 -- 示例 -- 结果缓存
- HDU - 4465 期望 + 取log优化
- ANR异常
- Navicat修改查询保存路径
- 实践作业3:白盒测试----junit的难点DAY11.
- Dubbo架构原理
- Java8 读写锁的改进:StampedLock(笔记)
热门文章
- [转]C++设计模式:Builder模式
- IE6/IE7下绝对定位position:absolute和margin的冲突问题解决
- Codeforces Round #203 (Div. 2) A.TL
- 【BZOJ】1303: [CQOI2009]中位数图(特殊的技巧)
- COJ262 HDNOIP201206施工方案
- Centos 中安装Java
- people 0919
- SQLLite 可以通过SQL语言来访问的文件型SQL数据库
- Eclipse学习记录
- visual studio 中使用的插件介绍