JPEG的的编解码

JPEG的的编解码过程

JPEG采用YCrCb的颜色模式,通常叫着YUV,其中Y代表亮度,Cr,cb代表色度和饱和度。
  而我们通常熟悉的计算机系统采用RGB颜色模式
1.采样-分块-量化--数据编码
  分块 数据采样完成后就需要进行下一步操作,进行空间域向频率域转换DCT变换
  JPEG分别针对Y亮度、UV色度和饱和度提供两张不同的量化表

1.采样 YUV422P 也属于YUV422的一种,它是一种Plane模式,即平面模式,
    并不是将YUV数据交错存储,
	 而是先存放所有的Y分量,然后存储所有的U(Cb)分量, 最后存储所有的V(Cr)分量
    一个2*2的像素块中,对于4个像素点,采样4个Y的值,两个U的值,两个V的值;

cv::Size(1920,1280)
 CV_8UC1 ----->8位无符号整型单通道矩阵
 CV_32FC2----->32位浮点型双通道矩阵

代码库

 libjpeg 是一个完全用C语言编写的库,包含了被广泛使用的JPEG解码、JPEG编码和其他的JPEG功能的实现。
 ibpng   是一款C语言编写的比较底层的读写PNG文件的跨平台的库
 
 libjpeg-turbo图像编解码器
 
 https://github.com/ApolloAuto/apollo/blob/master/modules/common_msgs/sensor_msgs/sensor_image.proto
 https://github.com/CESNET/GPUJPEG/blob/master/libgpujpeg/gpujpeg_encoder.h
 https://sourceforge.net/projects/libjpeg-turbo/files/
 https://github.com/lilohuang/PyTurboJPEG
 
 内存数据给到结构体
   v4l2接口直接获取摄像头数据。v4l2是c语言
 
 RGB搞到内存
  GPU解码被称为硬件解码,而CPU解码是软件解码
  
  利用GPU来加速处理图像编解码以及图像处理, 为此很有必要先了解J
  
  CPU和GPU的内存在物理上是独立的,并通过PCI-Express总线相连 PCIe带宽最高也十几个G
  NVIDIA的API里,可以看到一般CPU称为Host,GPU称为Device。
      所以也就有了htod,dtoh,dtod代表3种不同的传输方向
  	
  CPU分配内存主要有两种方式:
  	通过C标准库中的malloc函数完成  调用CUDA中的cudaMallocHost函数

定位模块

全球定位系统(GPS)和惯性测量单元(IMU)集成已成为实现可靠和精确位置跟踪的基石
  
a. 全球定位系统(GPS)
   RTK(Real - time kinematic,实时动态)载波相位差分技术  
  
b. IMU测量值解释-IMU,全称inertial measurement unit,即惯性测量单元,主要用于测量自身位姿,位姿包含位置和姿态
     IMU在测量时,得到的角速度或者加速度均是相对于地心惯性系结果,
      并且将该结果表示到Body坐标系下,就形成了最终的IMU输出。
	IMU容易因误差积累而产生漂移,导致位置和速度估计不准确。。惯导可以拿到:角速度 加速度 以及位姿 

轮式里程计线速度和角速度
自定位以及基于航位推测(Dead-reckoning, DR)估计的里程计信息	

C++ 编程起始

int main(int argc,char* argv[]) 也可以写成 int main(int argc,char** argv)
int main(int argc,char* argv[]) 也可以写成 int main(int argc,char** argv)。
     argc 表示程序运行时发送给main函数的命令行参数的个数(包括可执行程序以及传参)。
     argv[]是字符指针数组,它的每个元素都是字符指针,指向命令行中每个参数的第一个字符。
     
     argv[0]指向可执行程序。
     argv[1]指向可执行程序后的第一个字符串。
     argv[2]指向可执行程序后的第二个字符串 。
     argv[3]指向可执行程序后的第三个字符串 。
     argv[argc]为NULL。
--表现形式和内容本质
    char* argv[]和char** argv的声明差异,从声明、内存管理和文件作用域
    声明差异-语法
         char* argv[]声明一个数组argv,该数组保存多个指向char类型的指针
         char **argv声明 argv为指向(指向 char 类型的指针)的指针
        换句话说,一个是数组类型的声明,一个是指针类型的声明
    从内存管理的角度分析
       在声明数组的时候,会在内存中分配连续的数组空间
       在分配指针的时候,不会分配上述空间
    从函数传参
        对于函数传参,这两种方式的运行结果是相同的
		
	指针数组:用于存储指针的数组
	   char* argv[]来说,首先结合的时argv[]数组,这个数组中的数据类项是 char*, 因此是指针数组
	   char (*p)[5]首先结合的是(*p),这是个指针,指向的是个数组,因此是数组指针
	   *argv 是数组中第一个元素相当于line[0],argv[n]就相当于line[n],即地址一个指针,
	   **argv  是数组中存储的指针所指向的元素,即具体的字符。
posted @ 2024-09-24 17:48  辰令  阅读(365)  评论(0)    收藏  举报