zoukankan      html  css  js  c++  java
  • 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:yyyyyyyy uuuuuuuu vvvvv yuv420: yuv yuv yuv

         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占用内存大小)),分析问题:

     1 // dump图像数据  事列
     2 void   dump(const int width, const int height, void *yBuf, void *uvBuf)
     3 {
     4        char buf[256] = {''};
     5        FILE* file_fd = fopen(buf, "wb");
     6        snprintf(buf, sizeof(buf), "/data/Effect/%dx%dvideodenoiser%d.yuv",width,height,4);
     7        file_fd = fopen(buf, "wb");
     8          if (file_fd != NULL) {
     9         void *data = NULL;
    10         int written_len = 0;
    11         data = (void *)((uint8_t *)yBuf);
    12          written_len += fwrite( data, width*height, 1, file_fd);
    13         if(NULL == uvBuf)
    14             data = (void *)((uint8_t *)yBuf+ width*height);
    15         else
    16             data = (void *)((uint8_t *)uvBuf);
    17         written_len += fwrite( data, width*height/2, 1, file_fd);
    18         fclose(file_fd);
    19         TSLOG("%s: dump-------sucess%d",__func__,4);
    20         } else {
    21         TSLOG("%s: fail t open file for image dumping", __func__); 
    22 }

     备注:

         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

  • 相关阅读:
    linux crontab 定时使用方法
    crontab 选择编辑器 select-editor
    设置定时任务为每天凌晨2点执行和每小时执行一次
    性能测试工具--SIEGE安装及使用简介 siege压力测试
    Vue基础
    使用 supervisor 管理进程
    长按listview弹出选项列表对话框
    左右滑动弹窗之间短信内容区域来显示上一条和下一条短信
    在开机广播中启动服务
    Android spinner 样式及其使用详解
  • 原文地址:https://www.cnblogs.com/cy568searchx/p/3894005.html
Copyright © 2011-2022 走看看