一、官方mpp之sample的总体分析

在这里插入图片描述

1、sample的整体架构

(1)sample其实是很多个例程,所以有很多个main函数

(2)每一个例程面向一个典型应用,common是通用性主体函数,我们只分析venc

(3)基本的架构是:venc中的main调用venc中的功能函数,再调用common中的功能函数,再调用mpp中的API,再调用HI3518E内部的硬件单元

我们使用sourceinsight软件建立工程来分析venc中的例程,将sample与include文件夹的文
件添加到工程进行分析。

理解海思的API函数,我们可以去参考它给的官方手册:
Hi3518E V200R001C01SPC030\01.software\board\document_cn\HiMPP IPC V2.0 媒体处理软件开发参考.pdf

(4)sample的配置和编译,重点注意很多环境变量,目录结构不要乱动,参考第一季的文章。

2、sample代码学习的关键

(1)得理解很多基础概念,譬如图像采集原理、模拟数字、通道、绑定等等

(2)得从宏观上理解整个视频采集、内部传递、处理、编码输出、网络传输等的过程。

(3)得反复看代码,熟才能生巧,才能帮助理解整个代码。

(4)得查阅mpp手册,熟悉海思这一套API的规矩和一般用法。

3、sample_venc.c的大体分析

(1)从main入手,main的传参分析

int main(int argc, char *argv[])
{
    HI_S32 s32Ret;
    if ( (argc < 2) || (1 != strlen(argv[1])))
    {
        SAMPLE_VENC_Usage(argv[0]);
        return HI_FAILURE;
    }

    signal(SIGINT, SAMPLE_VENC_HandleSig);
    signal(SIGTERM, SAMPLE_VENC_HandleSig);
    
    switch (*argv[1])
    {
        case '0':/* H.264@1080p@30fps+H.265@1080p@30fps+H.264@D1@30fps */
            s32Ret = SAMPLE_VENC_1080P_CLASSIC();
            break;
        case '1':/* 1*1080p mjpeg encode + 1*1080p jpeg  */
            s32Ret = SAMPLE_VENC_1080P_MJPEG_JPEG();
            break;
        case '2':/* low delay */
            s32Ret = SAMPLE_VENC_LOW_DELAY();
            break;
        case '3':/* roibg framerate */
            s32Ret = SAMPLE_VENC_ROIBG_CLASSIC();
            break;
        case '4':/* Thumbnail of 1*1080p jpeg  */
            s32Ret = SAMPLE_VENC_1080P_JPEG_Thumb();
            break;
#ifndef hi3518ev201			
		case '5':/* H.264 Svc-t */
			s32Ret = SAMPLE_VENC_SVC_H264();
			break;
#endif
        default:
            printf("the index is invaild!\n");
            SAMPLE_VENC_Usage(argv[0]);
            return HI_FAILURE;
    }
    
    if (HI_SUCCESS == s32Ret)
        printf("program exit normally!\n");
    else
        printf("program exit abnormally!\n");
    exit(s32Ret);
}

(2)几个基本概念:

void SAMPLE_VENC_Usage(char *sPrgNm)
{
    printf("Usage : %s <index>\n", sPrgNm);
    printf("index:\n");
    printf("\t 0) 1*1080p H264 + 1*VGA H264.\n");
    printf("\t 1) 1*1080p MJPEG encode + 1*1080p jpeg.\n");
    printf("\t 2) low delay encode(only vi-vpss online).\n");
    printf("\t 3) roi background framerate.\n");
    printf("\t 4) Thumbnail of 1*1080p jpeg.\n");
#ifndef hi3518ev201
	printf("\t 5) svc-t H264\n");
#endif
    return;
}
1、视频编码规范标准:
	H.264 H.265 MJPE

2、频分辨率(清晰度):
	1080P(1920*1080),它是美国电影电视工程师协会(SMPTE)制定的最高等级高清数字电视的格式标准
	720P(1280*720),美国电影电视工程师协会(SMPTE)制定的高等级高清数字电视的格式标准
	VGA(这里表示分辨率640*480,也指VGA接口)
	D1 是数字电视系统显示格式的标准,采集分辨率 D1=720x576 像素。

3、fps(frame per second) 帧率:
	是以帧称为单位的位图图像连续出现在显示器上的频率(速率)	

二、图像像素格式深度理解

1、颜色的学问

(1)颜色是主观还是客观存在?
  颜色的本质是光的波长,但是因为有人去看才有了颜色这个概念

(2)颜色的三个关键:亮度、色度、饱和度

  颜色是由亮度和色度共同表示的,色度是不包括亮度在内的颜色的性质,它反映的是颜色的色调和饱和度。

1、亮度是指发光体(反光体)表面发光(反光)强弱的物理量。人眼从一个方向观察光源,在
这个方向上的光强与人眼所“见到”的光源面积之比,定义为该光源单位的亮度,即单位投影面
积上的发光强度。亮度用符号L表示,亮度的单位是坎德拉/平方米(cd/m2),也就是每平方公
尺分之烛光。

2、色调是指图像的相对明暗程度,在彩色图像上表现为颜色。色调是地物反射、辐射能量强弱
在图像上的表现,地物的属性、几何形状、分布范围和组合规律都能通过色调差异反映在遥感
图像上。

3、饱和度是指色彩的鲜艳程度,也称色彩的纯度。饱和度取决于该色中含色成分和消色成分(
灰色)的比例。含色成分越大,饱和度越大;消色成分越大,饱和度越小。饱和度可定义为彩
度除以明度,与彩度同样表征彩色偏离同亮度灰色的程度。与彩度完全不是同一个概念。但由
于其代表的意义与彩度相同,所以才会出现视彩度与饱和度为同一概念的情况。

资料来源:https://zhidao.baidu.com/question/1689557599587545868.html

(3)人的眼睛并非理想完美的颜色识别器件,图像表达也有清晰度和质量高低的差异

(4)科学研究如何定义(或者表达、记录、计算)一种颜色,即如何将颜色数字化?

  色彩空间,色彩空间”一词源于西方的“Color Space”,又称作“色域”,色彩学中,人们建立了多种色彩模型,以一维、二维、三维甚至四维空间坐标来表示某一色彩,这种坐标系统所能定义的色彩范围即色彩空间。我们经常用到的色彩空间主要有RGB、CMYK、Lab等。

参考学习:https://blog.csdn.net/fanyun_01/article/details/103699490

2、rawRGB和图像采集过程

(1)图像采集的过程:光照在成像物体被反射->镜头汇聚->Sensor光电转换->ADC为rawRGB(ADC直接转换得到的原始RGB,RGB由rawRGB经过运算得到的)

(2)sensor上每个像素只采集特定颜色的光的强度,因此sensor每个像素只能为R或G或B,一般我们常说摄像头多少万像素,指的是sensor上的像素点的数量,一个像素点可以转换出一个模拟信号。

(3)rawRGB和RGB都是用来描述图像的,图像采集时RGB是由rawRGB计算而来的

RAW图像数据到RGB:https://blog.csdn.net/peng864534630/article/details/78177211

(4)因为图像颜色本身有一定连贯性,而且人眼是非理想的,因此图像采集和再显示给人这整个构成中有三个要素:分辨率、pitch(像素点之间的距离)、观看距离

(5)如果是视频,质量好坏还要加上帧率framerate

(6)图像的表达、压缩、修整等相关技术,就发生在rawRGB进来以后的各个环节

三、RGB和YUV详解

1、RGB方式表示颜色

(1)RGB有RGB565和RGB888(真彩色),ARGB(A表示透明度)等多种子分类

(2)RGB的本质:将色度分解为R、G、B三部分,然后记录下各个基色亮度数据(亮度值),RGB这种颜色表示方法并未记录颜色,只是表示了亮度。

RGB颜色表示:https://blog.csdn.net/PC_small_wang/article/details/100138219

(3)RGB的优势:方便数字化表达,广泛用于数字化彩色显示器,计算机编程等领域。

(4)RGB的劣势:和传统的灰度图(黑白图像)兼容不好,表达颜色的效率不高

(5)何基于RGB颜色模型的加色色彩空间都属于RGB色彩空间。RGB色彩空间由红绿蓝三原色的色度定义,借此可以定义出相应的色三角,生成其它颜色。完整的RGB色彩空间定义还需要给出白点的色度和伽玛校正曲线。最常见的RGB色彩空间是sRGB色彩空间。

2、YUV

(1)YUV也是一种色彩空间,Y表示亮度,U和V表示色度。只有Y就是黑白图像,再加上UV就是彩色图像了。YUV的一个好处就是让彩色系统和传统黑白系统很好的兼容。

(2)YUV和RGB的相同点是:都是用来表达颜色的数学方法;不同点是:对颜色的描述思路和方法不同。RGB将一个颜色拆解为3个纯色的亮度组合,YUV将一个颜色分解为一个亮度和2个色度的组合。

(3)RGB和YUV之间可以用数学方法互相换算,是个典型的浮点运算过程。浮点运算比较庞大,最好用CPU进行计算。
在这里插入图片描述
详细过程可百度搜索别人写的博客。
(4)YUV和YCbCr几乎可以看做一个概念,详细的区分以后再去慢慢体会。YCbCr模型来源于yuv模型,应用于数字视频。

(5)YUV分为packed和planar两种。具体参考:http://blog.csdn.net/sunnylgz/article/details/7580628
在这里插入图片描述
这个图只是为了让大家理解二者数据存放方式的区别(但实际上数据排列不是这样的)
(6)有多种YUV相关的概念需要弄清楚(自己百度学习)

YUV
YUYV
YUV422
YUV420(YUV411)
YUV422 planar(YUV422P)
YUV420 Planar(YUV420P)
YUV422 semi planar(YUV422SP)
YUV420 semi Planar(YUV420SP)

参考:http://blog.csdn.net/bingqingsuimeng/article/details/50716390
   https://www.2cto.com/kf/201303/198023.html
   https://www.cnblogs.com/watson/p/3788257.html

注:本资料大部分由朱老师物联网大讲堂课程笔记整理而来并且引用了部分他人博客的内容,如有侵权,联系删除!水平有限,如有错误,欢迎各位在评论区交流。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐