第2季:从官方例程深度学习海思SDK及API
2.1.官方mppsample的总体分析
2.1、sample的整体架构
(1)sample其实是很多个例程,所以有很多个main
(2)每一个例程面向一个典型应用,common是通用性主体函数,我们只分析venc
(3)基本的架构是:venc中的main调用venc中的功能函数,再调用common中的功能函数,再调用mpp中的API,再调用HI3518E内部的硬件单元。
(4)sample的配置和编译,重点注意很多环境变量,目录结构不要乱动,参考第一季。
2.2、sample代码学习的关键
(1)得理解很多基础概念,譬如图像采集原理、模拟数字、通道、绑定等等
(2)得从宏观上理解整个视频采集、内部传递、处理、编码输出、网络传输等的过程。
(3)得反复看代码,熟才能生巧,才能帮助理解整个代码。
(4)得查阅mpp手册,熟悉海思这一套API的规矩和一般用法。
2.3、sample_venc的大体分析
(1)从main入手,main的传参分析
(2)几个基本概念:
H.264 H.265 MJPEG 视频编码规范标准
1080P、720P、VGA、D1 视频分辨率(清晰度)
fps(frame per second) 帧率
2.2_3.图像像素格式深度理解1_2
2.2.1、颜色的学问
(1)颜色是主观还是客观存在?颜色的本质是光的波长,但是因为有人去看才有了颜色这个概念
(2)颜色的三个关键:亮度、色度、饱和度
(3)人的眼睛并非理想完美的颜色识别器件,图像表达也有清晰度和质量高低的差异
(4)科学研究如何定义(或者表达、记录、计算)一种颜色?色彩空间的概念
2.2.2、rawRGB和图像采集过程
(1)图像采集的过程:光照在成像物体被反射->镜头汇聚->Sensor光电转换->ADC为rawRGB
(2)sensor上每个像素只采集特定颜色的光的强度,因此sensor每个像素只能为R或G或B
(3)rawRGB和RGB都是用来描述图像的,图像采集时RGB是由rawRGB计算而来的
(4)因为图像颜色本身有一定连贯性,而且人眼是非理想的,因此图像采集和再显示给人这整个构成中有三个要素:分辨率、pitch、观看距离
(5)如果是视频,质量好坏还要加上帧率framerate
(6)图像的表达、压缩、修整等相关技术,就发生在rawRGB进来以后的各个环节
2.4_5.RGB和YUV详解1_2
2.4.1、RGB方式表示颜色
(1)RGB有RGB565和RGB888,ARGB等多种子分类
(2)RGB的本质:将色度分解为R、G、B三部分,然后记录下亮度数据
(3)RGB的优势:方便数字化表达,广泛用于数字化彩色显示器,计算机编程等领域。
(4)RGB的劣势:和传统的灰度图兼容不好,表达颜色的效率不高
2.4.2、YUV
(1)YUV是一种色彩空间,Y表示亮度,U和V表示色度。只有Y就是黑白图像,再加上UV就是彩色图像了。YUV的一个好处就是让彩色系统和传统黑白系统很好的兼容。
(2)YUV和RGB的相同点是:都是用来表达颜色的数学方法;不同点是:对颜色的描述思路和方法不同。RGB将一个颜色拆解为3个纯色的亮度组合,YUV将一个颜色分解为一个亮度和2个色度的组合。
(3)RGB和YUV之间可以用数学方法互相换算,是个典型的浮点运算过程。
(4)YUV和YCbCr几乎可以看做一个概念,详细的区分以后再去慢慢体会。
(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
2.6.海思MPP功能模块和视频缓存池
2.6.1、MPP功能模块
(1)找到MPP手册
(2)详见系统概述1.3部分
2.6.2、sample中SAMPLE_VENC_1080P_CLASSIC函数开始看
(1)PAYLOAD_TYPE_E
(2)PIC_SIZE_E
(3)VB_CONF_S
2.7.视频缓存池
2.7.1、什么是视频缓冲池
(1)视频的本质是多帧图片,图片的本质是RGB或rawRGB数据,要占用一段连续内存
(2)视频的裁剪、缩放、修正处理等各种操作,本质上就是对内存中的数据进行运算
(3)视频缓存池(VB, video buffer)就是一段很大,又被合理划分和管理的内存,用来做视频数据的暂存和运算场地
(4)公共视频缓存池的公共2字,可以理解为全局变量,也就是各个模块都能访问的一段内存
(5)看似视频缓存块在各个模块之间流转,实际上并没有内存复制,而是指针在传递
(6)视频缓存池的内存由MPP来维护,我们在系统启动时就把整个SDRAM分成了2部分:系统部分(由linux kernel来维护管理)和mpp部分(由mpp系统来维护管理)
(7)缓存池需要几个,每个中包含几个缓存块,每个缓存块多大,都是可以由用户程序设置好参数,然后调用MPP的相应API来向MPP申请分配的。
2.7.2、相关的数据结构和API
(1)VB_CONF_S
(2)HI_MPI_VB_SetConf
(3)HI_MPI_VB_Init
2.8_9.程序流程分析和MPP初始化详解1_2
2.8.1、整个main流程分析
2.8.2、MPP系统初始化详解
(1)什么是MPP系统
(2)MPP系统为什么要初始化
(3)MPP系统初始化为什么要在最前面
(4)MPP系统怎样进行初始化
(5)MPP系统初始化尤其注意API调用的顺序
2.10.VI部分详解1
2.10.1、上节遗留问题
(1)CEILING_2_POWER宏的作用
(2)PIXEL_FORMAT_YUV_SEMIPLANAR_420是怎么定出来的
2.10.2、学习方法:绘制调用关系图谱
(1)简单浏览VI部分的调用层次,发现很复杂
(2)有些函数是sample写的,有些是调用MPP的,数据结构也是2种都有
(3)学习重点1:全局把控熟悉整个过程全景视图
(4)学习重点2:掌握细节数据结构元素含义,和遇到的概念
(5)学习重点3:知道某些关键操作在哪里定义,哪里设置,将来需要改的时候能找到地方
2.10.3、绘制VI部分调用关系
2.11_12.VI部分详解2_3
(1)常用Sensor的接口有三种:MIPI、LVDS、DC
(2)WDR宽动态
(3)isp就是image signal process,图像信号处理。
(4)HI3518E内部的ISP单元是隶属于VI模块的。VI模块就包含3大部分:第一部分是和Sensor对接的部分,第二部分就是ISP,第三部分就是VI dev和channel
2.13.VPSS部分详解1
2.13.1、VPSS的手册部分解读
2.13.2、VPSS的函数调用关系图谱
2.14_15.VPSS部分详解2_3
2.13.3、VPSS的Grp和Chn
(1)VPSS的Grp
(2)VPSS的Chn
(3)VI的Chn(和Dev)
2.13.4、VPSS部分代码详解
2.16.图像编码压缩基本原理
参考:http://blog.csdn.net/newchenxf/article/details/51693753
2.17.MPP手册中图像编码部分解读
参考:http://blog.csdn.net/u013354805/article/details/51988171
2.18.sample中venc模块源码解读
2.19.编码后的流文件输出和课程总结
main
SAMPLE_VENC_1080P_CLASSIC
(step 1: init sys variable)
SAMPLE_COMM_VI_GetSizeBySensor
SAMPLE_COMM_SYS_CalcPicVbBlkSize
(step 2: mpp system init.)
SAMPLE_COMM_SYS_Init
HI_MPI_SYS_Exit();
HI_MPI_VB_Exit();
HI_MPI_VB_SetConf
HI_MPI_VB_Init
HI_MPI_SYS_SetConf
HI_MPI_SYS_Init
( step 3: start vi dev & chn to capture ## 3.启动输入和通道捕获 ##)
SAMPLE_COMM_VI_StartVi
IsSensorInput
SAMPLE_COMM_VI_StartIspAndVi
SAMPLE_COMM_VI_StartMIPI(1)
SAMPLE_COMM_VI_SetMipiAttr
fd = open("/dev/hi_mipi", O_RDWR);
ioctl(fd, HI_MIPI_SET_DEV_ATTR, pstcomboDevAttr)
SAMPLE_COMM_ISP_Init(2)
sensor_register_callback
HI_MPI_AE_Register
HI_MPI_AWB_Register
HI_MPI_AF_Register
HI_MPI_ISP_MemInit
HI_MPI_ISP_SetWDRMode
HI_MPI_ISP_SetPubAttr
HI_MPI_ISP_Init
SAMPLE_COMM_ISP_Run(3)
pthread_create(&gs_IspPid, &attr, (void* (*)(void*))Test_ISP_Run, NULL)
Test_ISP_Run
HI_MPI_ISP_Run
SAMPLE_COMM_VI_StartDev(4)
HI_MPI_VI_SetDevAttr
HI_MPI_ISP_GetWDRMode
HI_MPI_VI_SetWDRAttr
HI_MPI_VI_EnableDev
SAMPLE_COMM_VI_StartChn(5)
HI_MPI_VI_SetChnAttr
HI_MPI_VI_SetRotate
HI_MPI_VI_EnableChn
(step 4: start vpss and vi bind vpss ##4:启动视频处理模块和绑定视频输入(通道)##)
SAMPLE_COMM_SYS_GetPicSize
SAMPLE_COMM_VPSS_StartGroup
SAMPLE_COMM_VI_BindVpss
SAMPLE_COMM_VPSS_EnableChn
( step 5: start stream venc # 可以在这里叠加OSD信息,并研究哪些码流 #)
SAMPLE_COMM_VENC_Start
SAMPLE_COMM_VENC_BindVpss
( step 6: stream venc process -- get stream, then save it to file.)
SAMPLE_COMM_VENC_StartGetStream
(step 7: exit process)
SAMPLE_COMM_VENC_StopGetStream
ORTP初始化
未完待续...
第2季:从官方例程深度学习海思SDK及API的更多相关文章
- spring学习笔记---第三方SDK(Rest API)和Jaskson的巧用
前言: 其实我以前一直不懂电商, 以及电商中所涉及的业务概念. 对于SKU等名词, 觉得有些玄乎. 对其背后的数据模型, 也有莫名的未知恐惧感: 庞大而理不清头绪. 不过最近有机会接触了微商(有赞), ...
- 深度学习框架Keras与Pytorch对比
对于许多科学家.工程师和开发人员来说,TensorFlow是他们的第一个深度学习框架.TensorFlow 1.0于2017年2月发布,可以说,它对用户不太友好. 在过去的几年里,两个主要的深度学习库 ...
- 深度学习调用TensorFlow、PyTorch等框架
深度学习调用TensorFlow.PyTorch等框架 一.开发目标目标 提供统一接口的库,它可以从C++和Python中的多个框架中运行深度学习模型.欧米诺使研究人员能够在自己选择的框架内轻松建立模 ...
- NVIDIA TensorRT高性能深度学习推理
NVIDIA TensorRT高性能深度学习推理 NVIDIA TensorRT 是用于高性能深度学习推理的 SDK.此 SDK 包含深度学习推理优化器和运行时环境,可为深度学习推理应用提供低延迟和高 ...
- 深度学习框架: Keras官方中文版文档正式发布
今年 1 月 12 日,Keras 作者 François Chollet 在推特上表示因为中文读者的广泛关注,他已经在 GitHub 上展开了一个 Keras 中文文档项目.而昨日,Françoi ...
- 转发——谷歌云官方:一小时掌握深度学习和 TensorFlow
转发——谷歌云官方:一小时掌握深度学习和 TensorFlow 本文转发自新智元,链接如下: http://mp.weixin.qq.com/s?__biz=MzI3MTA0MTk1MA==& ...
- PyTorch 60 分钟入门教程:PyTorch 深度学习官方入门中文教程
什么是 PyTorch? PyTorch 是一个基于 Python 的科学计算包,主要定位两类人群: NumPy 的替代品,可以利用 GPU 的性能进行计算. 深度学习研究平台拥有足够的灵活性和速度 ...
- 利用Tengine在树莓派上跑深度学习网络
树莓派是国内比较流行的一款卡片式计算机,但是受限于其硬件配置,用树莓派玩深度学习似乎有些艰难.最近OPENAI为嵌入式设备推出了一款AI框架Tengine,其对于配置的要求相比传统框架降低了很多,我尝 ...
- 开发者必看!探秘阿里云Hi购季开发者分会场:海量学习资源0元起!
摘要: 开发者分会场致力于帮助开发者学习了解阿里云最新技术,为开发者设计全方位的技术成长与进阶之路. 2019阿里云云上Hi购季活动已经于2月25日正式开启,从已开放的活动页面来看,活动分为三个阶段: ...
随机推荐
- Ivan and Burgers CodeForces - 1100F (线性基)
大意: 给定n元素序列, m个询问$(l,r)$, 求$[l,r]$中选出任意数异或后的最大值 线性基沙茶题, 直接线段树暴力维护两个log还是能过的 #include <iostream> ...
- python-day8-赋值
# x=10 #链式赋值# a=b=c=d=e=f=10# print(a,b,c,d,e,f) #增量赋值 # x=10# y='a'# temp=x# x=y# y=temp# print(x,y ...
- OAF SubTabLayoutBean隐藏子控件
SubLayout隐藏子控件有两种方法 OASubTabLayoutBean layBean = (OASubTabLayoutBean) webBean.findIndexedChildRecurs ...
- jenkins安装笔记(一)
转载地址:https://www.cnblogs.com/sylvia-liu/p/4485311.html 自动化架构搭建过程中为实现当开发源码更新时自动化脚本同步触发自动执行,使用到持续集成工具J ...
- 061——VUE中vue-router之通过程序控制路由跳转
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- ZOJ 1985 Largest Rectangle in a Histogram(刷广告)2010辽宁省赛
Largest Rectangle in a Histogram Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 21204 ...
- HDU 1501 Zipper(DFS)
Problem Description Given three strings, you are to determine whether the third string can be formed ...
- 好玩的Python库tqdm (转载)
原文地址: https://blog.csdn.net/zejianli/article/details/77915751 可以显示循环的进度条的库,再也不用担心不知道程序跑到哪里还要跑多久了 tqd ...
- Ubuntu16.04 和 hadoop2.7.3环境下 hive2.1.1安装部署
参考文献: http://blog.csdn.NET/reesun/article/details/8556078 http://blog.csdn.Net/zhongguozhichuang/art ...
- error: QXcbConnection: Could not connect to display
/********************************************************************************* * error: QXcbConn ...