c++ 散乱学习之关键字

c++ 中基础语法

public 和 private

分为成员变量成员函数的和继承。

对于变量和函数来说:

public是类的成员函数,类的实例变量都可访问;private是类的实例变量不能访问,但是优元函数,变量可以访问。

对于继承来说:

派生类的成员函数,可以访问基类的public成员、protected成员,但是无法访问基类的private成员。(意思就是无法直接修改基类的private变量)

派生类的实例变量,可以访问基类的public成员,但是无法访问protected、private成员。

在我们的class attentionlight里,所有变量都是private的,不需要外部修改访问。细节实现逻辑函数都是private,不需要暴露。new 函数 set函数 transform函数是public的。外部接口调用。

static

https://blog.csdn.net/hhg337372083/article/details/89213878

static修饰变量

只初始化一次,在运行前就初始化了。生命周期是程序运行结束才释放的。

被 static 修饰的变量属于类变量,可以通过类名.变量名直接引用,而不需要 new 出一个类来,

类中static 变量独立于类的任意一个对象,其值修改被类的所有对象看到

static数据成员必须在类定义的外部定义,通常放在包含类的非内联成员函数定义的文件中。

但是也有例外,const static 数据成员可以在类的定义体中进行初始化,因为const定义时必须初始化。

static修饰函数

static 修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用

被 static 修饰的方法属于类方法,可以通过类名.方法名直接引用,而不需要 new 出一个类来

“ 为什么 ”static成员函数由于不与任何对象关联,因此它不具备this指针,因此,它无法访问属于类对象的非静态数据成员,也无法访问
非静态成员函数。也就是说,类的静态成员函数,只能调用该类的其它静态成员函数和静态数据成员。 但是在我们的工程里面有 static New呢

http://legendtkl.com/2014/09/30/cplusplus-static-and-virtual/

const

  1. 限定变量为不可修改。

  2. 限定成员函数不可以修改任何数据成员。

  3. const与指针:

    const char *p 表示 指向的内容不能改变 ; char * const p,就是将P声明为常指针,它的地址不能改变,是固定的,但是它的内容可以改变。

https://blog.csdn.net/shihuboke/article/details/79286669

virtual

感觉是方便子类进行多态的

override

https://blog.csdn.net/i_chaoren/article/details/77281785

防止子类在继承时,没有重写覆盖父类函数。仅在成员函数声明之后使用时才是区分上下文的且具有特殊含义;否则,它不是保留的关键字。使用 override 有助于防止代码中出现意外的继承行为。

typename

install asitop

install asitop 但是找不到

pip3 install asitop

安装成功了,但是显示

1
2
3
Installing collected packages: asitop

WARNING: The script asitop is installed in '/Users/PeppaZhu/Library/Python/3.9/bin' which is not on PATH.

然后无法运行asitop which whereis都找不到

需要添加环境变量

1
echo -e 'export PATH="$PATH:/Users/PeppaZhu/Library/Python/3.9/bin"' >> $HOME/.bash_profile

然后就可以了

然后下次打开咋又不行了呢

需要source ~/.bash_profile 使得环境变量生效

YUV storage

令人迷惑的YUV存储模式

奇怪的知识增加了

除YUV之外,经常提到的还有 YPbPr 和 YCbCr。YPbPr 指模拟分量信号(或接口),P(Parallel)表示并行,b 下标表示蓝,r 下标表示红。YCbCr 指的是数字分量信号(或接口),C(Chroma)表示色度。YCbCr 还可指色彩空间,YCbCr 色彩空间是 YUV 色彩空间的缩放和偏移版本。

YUV采样方式

主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0。这些采样方式,不压缩 Y 分量,对 UV 分量的压缩程度不同。

YUV存储方式

存储模式分成三大类:

packed:将 Y、U、V 分量交织存放在一起,和 RGB 的存放方式类似。内存中排列形式类似:YVYUYVYUYVYUYVYU…。在具体的存储模式命名中,packed 格式不带后缀 P。

planar:将 Y、U、V 的三个分量分别存放在不同的矩阵(平面)中。内存中排列形式类似:YYYYYY…,UUUUUU…,VVVVVV…。在具体的存储模式命名中,planar 格式带后缀 P。

semi-planar:将 Y、U、V 三个分量放在两个矩阵(平面)中。Y 占用一个平面,UV 共用一个平面。内存中排列形式类似:YYYYYY…,UVUVUV…。在具体的存储模式命名中,semi-planar 格式带后缀 SP。

存储方式加上采样方式

https://developer.aliyun.com/article/782082

其中有些常用的

semi-planar 存储模式 YUV420SP

NV12:

1
2
3
4
5
6
7
Y Y Y Y
Y Y Y Y
Y Y Y Y
Y Y Y Y
-------
U V U V
U V U V

NV21:

1
2
3
4
5
6
7
Y Y Y Y
Y Y Y Y
Y Y Y Y
Y Y Y Y
-------
V U V U
V U V U

planar 存储模式 YUV420P

YU12/IYUV/I420:

1
2
3
4
5
6
7
8
9
10
Y Y Y Y
Y Y Y Y
Y Y Y Y
Y Y Y Y
-------
U U
U U
---
V V
V V

YV12:

1
2
3
4
5
6
7
8
9
10
Y Y Y Y
Y Y Y Y
Y Y Y Y
Y Y Y Y
-------
V V
V V
---
U U
U U

一段读取YUV420数据的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
class VideoCaptureYUV:
def __init__(self, filename, size):

​ self.width, self.height = size

​ self.Y_len = self.width * self.height

​ self.UV_len = self.width * self.height // 4

​ self.f = open(filename, 'rb')

​ self.Y_shape = (self.height, self.width)

​ self.UV_shape = (self.height//2, self.width//2)



​ def read_raw(self):

​ raw = self.f.read(self.Y_len)

​ Y = np.frombuffer(raw, dtype=np.uint8)

​ Y = Y.reshape(self.Y_shape)



​ raw = self.f.read(self.UV_len)

​ u = np.frombuffer(raw, dtype=np.uint8)

​ u = u.reshape(self.UV_shape)





​ raw = self.f.read(self.UV_len)

​ v = np.frombuffer(raw, dtype=np.uint8)

​ v = v.reshape(self.UV_shape)

​ return Y,u,v



​ def read(self):

​ Y,u,v = self.read_raw()

​ img = np.concatenate((Y.reshape(-1), u.reshape(-1), v.reshape(-1)))

​ img = img.reshape((self.height * 3 // 2, self.width)).astype('uint8') # YUV 的存储格式为:I420(YYYY UUVV)

​ \#print(yuv.shape)

​ bgr = cv2.cvtColor(img, cv2.COLOR_YUV2BGR_I420)

​ return bgr

ffmpeg record

深海巨坑ffmpeg的使用记录

服务器上安装

apt install ffmpeg

将多帧图像合成视频

ffmpeg -r 30 -i output_video/%05d.jpg -vcodec libx264 -vf zscale=matrix=709:r=full output_video_fullr.mp4

-vf zscale=matrix=709:r=limited负责转换色域,否则默认转出来是BT.601之类的SD标准。显式指定limited 色域很多种,limited显得饱和度高一些,full色域大,同样数据显得饱和度低一些

这个链接 https://fireattack.github.io/blog/2018/07/03/ffmpeg-commands.html

编码质量控制: -c:v libx264 -preset veryslow -crf 0

将yuv视频分png

ffmpeg -s 1080x720 -pix_fmt yuv420p -i dst_1080x720_30Hz_P420.yuv -vf scale=in_range=full:out_range=full output_ori/%05d.png
-vf scale=in_range=full:out_range=full 来控制色彩
这个链接 https://www.bilibili.com/read/cv6601959/

截取视频片段

按照时间截取

ffmpeg -i input.mp4 -vcodec copy -acodec copy -ss 00:00:00 -to 00:00:05 cutout.mp4 -y

按照帧截取

ffmpeg -i input.mp4 -vf”select=between(n,20,200)” -y -acodec copy cutout.mp4

将YUV转成MP4

ffmpeg -s 640x480 -pix_fmt yuv420p -i output.yuv out3.mp4

将MP4转YUV

ffmpeg -i input.mp4 -s 640x480 -pix_fmt yuv420p output.yuv

视频分帧

ffmpeg -i backlit.mp4 -r 30 backlit/%05d.png

如果改成jpg会有严重压缩

如果转化成png还有压缩的话,可以先将mp4转成yuv, yuv单帧的质量也就是图片单帧能达到的最高质量。然后将yuv视频转化成图像。

将视频拼接

ffmpeg -i peppa_v3_fullr.mp4 -i peppa_v5_fullr_.mp4 -filter_complex "[0:v]pad=iw*2:ih*1[a];[a][1:v]overlay=w" compair_peppa_v3v5.mp4

这个链接 https://blog.csdn.net/Gary__123456/article/details/88742705

转封装

ffmpeg -i xx.mov c:v copy xx.mp4

视频resize

ffmpeg -i testbanding.mp4 -s 1280:720 -aspect “16:9” testbanding_1280x720.mp4

一张图片转视频

ffmpeg -r 10 -f image2 -loop 1 -i 1.jpg -s 1080x1920 -pix_fmt yuvj420p -t 4 -vcodec libx264 1.mp4