HiS视频处理

海思图像采集显示流程

1 rawRGB--->RGB(sensor---->ADC---->rawRGB---->RGB)

1.1  sensor硬件原理

      (1)sensor传感器被分成很多个区域块,每一个块上就有一个光电传感器(CCD是一种半导体器件,能够把光学影像转化为电信号),把光传化成电,比如一个8*8的sensor,每一个上面只能识别一个颜色,加了滤镜,这样一个传感器才能将一种颜色传化成一个电压代表一个确定的颜色,即rawRGB。

        (2)如下图,bayer格式图片(就是rawRGB的排列方式)是伊士曼·柯达公司科学家Bryce Bayer发明的,有四种:RGGB、GRBG、GBRG、BGGR,因为人眼对绿色敏感,所以使用一半的像素点为绿色(G),四分之一的像素点分别是红色(R)和蓝色(B)的滤镜。

                                                            

                        通过选择不同的bayer,设置sensor时,要从对应点取起始点,如rggb取点为(1、0)


1.2  rawRGB转RGB算法

                        

                       G(R) = (G1 + G3) / 2 if abs(R1 – R3) < abs(R2 – R4)      //G(R)=中间的红色R

                    G(R) = (G2 + G4) / 2 if abs(R1 – R3) > abs(R2 – R4)      //ABS取绝对值

                    G(R) = (G1 + G2 + G3+ G4) / 4 if abs(R1 – R3) = abs(R2 – R4)

                        G(B) = (G1 + G3) / 2 if abs(B1 – B3) < abs(B2 – B4) 
                        G(B) = (G2 + G4) / 2 if abs(B1 – B3) > abs(B2 – B4) 

                    G(B) = (G1 + G2 + G3+ G4) / 4 if abs(B1 – B3) = abs(B2 – B4)

                    如果觉得这样执行速度的很慢的话,就简单的吧G1-4全都加起来求平均好了!

    (1)图像采集再显示给人这整个构成中有三个要素:分辨率(4*4)、pitch(光电传感器中心之间的距离),观看距离

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

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

2 RGB---->YUV

2.1 RGB

(1)RGB有RGB565和RGB888,ARGB等多种子分类

(2)RGB的本质:将色度分解为R、G、B三部分,然后记录下亮度数据

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

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

2.2、YUV

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

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

(3)RGB和YUV之间可以用数学方法互相换算,是个典型的浮点运算过程。

(4)YUV的内别如一个4*4的像素

        

         YUV packer

         第一个像素1,(Y1,U1,V1)、像素2(Y2,U2,V2)、像素3(Y3,U3,V3)、像素4(Y4,U4,V4)

         存储格式不同[Y1,U1,V1,Y2----,Y3-----,Y4-----]


         YUV420 planner

         第一个像素1,(Y1,U1,V1)、像素2Y2,U1,V1、像素3Y3,U1,V1、像素4Y4,U1,V1

         4*4内存中存储格式为 [Y1,Y2,Y3,Y4,U1,U2]; 

         4*8像素[Y1,Y2,Y3,Y4,Y5---Y32,U1,V1,U2,V2,U3----V8]

                        

         YUV420 semi   4Y :1U:1V (420)

          其它同上,存储格式不同[Y1,Y2,Y3,Y4,Y5---Y32,U1---U8,V1----V8]


         YUV422   

                     4Y:2U:2V(422)

海思中VI(视频输入)部分对应结构体填充,决定将RGB转成什么格式的YUV

            SAMPLE_COMM_VI_StartChn()

                    stChnAttr.enPixFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420;


3  海思流程

    第一步:更具摄像头本身支持

            (1)选择我们想要得到的图片格式,如720p

            (2)计算好一帧图片存储需要的内存大小(确定缓冲块的大小,就是指一帧图像大小)

            (3)看VI输出几路视频流,创建几个公共视频缓冲池(比如我们要一路720p,一路1080p)一路经过VPSS,一路直接用RGB播发器播放

            (4)通过各路对视频流做几种不同的处理,给每个缓冲池分配几个缓冲块,不同缓冲块里面存放不同算法处理的图像数据,比如原数据占一块(不能改动原),我们输出3种不同结果,则需要4个缓冲块(m、i、j、k)。

            (5)填充好stVbConf结构体,调用API初始化写入硬件

                    

     第二步:VI采集捕获图像并简单处理

            (1)ISP:对3A进行模式设置并注册

            (2)填充rawRGB转换RGB格式、帧率、起始取点、图像尺寸的结构体stPubAttr,并写入

            (3)初始化ISP,HI_MPI_ISP_Init

            (4)开始创建线程进行处理:SAMPLE_COMM_ISP_Run()

                                                                        pthread_create()

            (5)使能VI设备:SAMPLE_COMM_VI_StartDev

                                                HI_MPI_VI_EnableDev(ViDev);

        (6)创建并使能通道(可进行图像翻转等基本操作)之后捕获图像,这一步就会让数据直接存放在视频缓冲池: HI_MPI_VI_EnableChn(ViChn);

     第三步:VPSS(视频处理子系统)   

            (1)对stVpssGrpAttr结构体填充:包括去噪,图像增强、渲染、YUV格式等设置

            (2)创建通道组,将本通道填充的stVpssGrpAttr写入

            (3)VI与VPSS绑定

            (4)使能VPSS通道,RGB按照之前的要求经过处理最后生成我们需要的视频裸流(包括格式,尺寸,效果)放在Bi块(Bi是Bm处理后的图像数据)

     第四步:VENC视频编码

            (1)先去填充stH264Attr、stAttrH265Vbr结构体(包括编码图像的尺寸,一帧图像需要的buffer等一些264的标准),然后memcpy到stVencChnAttr

            (2)创建适合我们需要的编码通道,HI_MPI_VENC_CreateChn(VencChn, &stVencChnAttr)

            (3)VENC绑定VPSS     HI_MPI_SYS_Bind(&stSrcChn, &stDestChn);

            (4)更具创建的不同编码要求的通道(即上面填充的不同),得到从通道返回的变量如下(需要被编码的图像格式): stVencChnAttr.stVeAttr.enType,通过格式决定编码出来的文件名      HI_MPI_VENC_GetChnAttr

            (5)创建文件 fopen(aszFileName[i], "wb");文件名和创建方式只写

            (5)得到各路编码文件描述符FD       HI_MPI_VENC_GetFd(i);

            (6)将各路编码文件描述符放入select监测内,一旦编码完成,select返回大于0,通过FD_ISSET(fd, &read_fds),判断是哪路fd编码完成,进去执行相应处理

            (7)相应处理 首先询问venc   HI_MPI_VENC_Query得到stStat.u32CurPacks成功后,给结构体编码流分配内存空间stStream.pstPack

            (8) 得到编码流,存放在上一步分配空间的stStream结构体中     HI_MPI_VENC_GetStream

    第五步:保存到文件或网络发送

            (1)将stStream中的编码数据,存入先前创建的文件  fwrite或者使用orpt发送出去

猜你喜欢

转载自blog.csdn.net/qq_40334837/article/details/80789868