电子技术实习期末复习

电子技术实习期末复习

Volcano Lv1

1.1掌握树莓派硬件结构、GPIO、PWM、I2C的基本知识。PWM概念和调制(LED灯、无源蜂鸣器)

1.1.1 树莓派硬件结构

image 20240624171201779 1719220324314 31 1719220328125 33 副本

48f03e67277f3393d862ae5779d0418 1719234793775 40

1.1.2 GPIO

GPIO 口通用输入输出端口的简称,PIN 脚依照考量可作为通用输入(GPI)或通用输出

(GPO)或者通用输入输出(GPIO)

1.1.3 PWM概念和调制(LED灯、无源蜂鸣器)

脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制。

  1. pwm的频率:

    是指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期);

    也就是说一秒钟PWM有多少个周期
    单位: Hz
    表示方式: 50Hz 100Hz

  2. pwm的周期:

    T=1/f
    周期=1/频率
    50Hz = 20ms 一个周期

    如果频率为50Hz ,也就是说一个周期是20ms 那么一秒钟就有 50次PWM周期

  3. 占空比:
    是一个脉冲周期内,高电平的时间与整个周期时间的比例。
    单位: % (0%-100%)
    表示方式:20%
    即脉宽时间占总周期时间的比例。

    PWM就是在合适的信号频率下,通过一个周期里改变占空比的方式来改变输出的有效电压。

PWM:

脉宽调制(PWM)是指用微处理器的数字输出来对模拟电路进行控制,是一种对模拟信号电平进行数字编码的方法。在树莓派上,可以通过对GPIO的编程来实现PWM。

1、创建一个 PWM 实例:

1
p = GPIO.PWM(channel, frequency)

2、启用 PWM:

1
p.start(dc) # dc 代表占空比(范围:0.0 <= dc >= 100.0)

3、更改频率:

1
p.ChangeFrequency(freq) # freq 为设置的新频率,单位为 Hz

4、更改占空比:

1
p.ChangeDutyCycle(dc) # 范围:0.0 <= dc >= 100.0

5、停止 PWM:

1
p.stop()

LED灯通过更改改变占空比的方式,表现不同颜色

image 20240624173644416 1719221807075 35

无源蜂鸣器通过更改频率的方式,表现不同音调

1.1.4 I2C

定义:IIC(又称I2C,Inter-Integrated Circuit),即集成电路总线,是一种两线式串行总线,由PHILIPS公司开发,用于连接微控制器及其外围设备。多用于主机和从机在数据量不大且传输距离短的场合下的主从通信。I2C总线由数据线SDA和时钟线SCL构成通信线路,既可用于发送数据,也可接收数据,是一种半双工通信协议。总线上的主设备与从设备之间以字节(8位)为单位进行双向的数据传输。

I2C总线需要两根线来实现连接于总线上的器件之间的信息传输,一根是SDA(Serial Data)串行数据线,另一根是SCL(Serial Clock)串行时钟线

1、空闲状态

I2C总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。

2、开始信号

SCL保持高电平期间,SDA的电平被拉低,称为I2C总线总线的起始信号,标志着一次数据传输开始。

3、停止信号

SCL保持高电平期间,SDA被释放,返回高电平,称为I2C总线的停止信号,标志着一次数据传输的终止。

数据传输

在I2C总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在SCL串行时钟的配合下,在 SDA上逐位地串行传送每一位数据。除了开始和停止,IIC总线要遵循:SCL为低电平的时候,数据才能变化;SCL为高电平的时候,数据必须保持稳定。

为什么SDA在SCL低电平期间才允许改变状态?

因为当SCL处于高电平状态时,SDA拉低表示的是起始位,拉高表示的是停止位,所以当数据位中0和1出现时,如果在SCL高电平状态下SDA状态变化的话,就无法区分数据和起始、停止位。

1.2 树莓派系统配置及远程登录的方法,树莓派系统实验过程中遇到的一些常见命令:如切换到用户目录,进入文件编辑器,安装软件,重启、关机等。

1.2.1树莓派系统配置及远程登录的方法

4.配置VNC

  • 安装VNC-Viewer,输入树莓派IP地址,回车,点击continue
  • 输入树莓派的账号密码,点击OK,实现无屏幕无线VNC开启树莓派

3.配置SSH

  • 首先要确保电脑和树莓派连接到同一个wifi
  • 查看电脑IP地址
  • 使用Advanced IP Scanner软件查找到自己树莓派的IP地址
  • 打开putty.exe,使用SSH远程登录树莓派
  • 输入树莓派的账号:pi,密码:raspberry
  • 输入命令sudo raspi-config,回车
  • 在选项“Interfacing Options…”中使能VNC,退出菜单

2.设置WiFi

  • 打开开机配置文件夹 ,里面有ssh文件和wpa_supplicant.conf文件,使用Notepad++打开wpa_supplicant.conf文件;
  • 把wpa_supplicant.conf文件中,第一个network的中括号中的ssid和psk要改成自己实验室的wifi账号和密码,靠这个文件连接wifi;
  • 将ssh文件和wpa_supplicant.conf文件拷贝到boot路径下。

1.系统烧录

  • 把16G内存卡插入读卡器中,将读卡器插在电脑上;
  • 非新盘可使用格式化工具对该盘进行格式化;
  • 使用Windows命令进行格式化:
    • 首先把准备格式化的U盘插在电脑上,直接用Win+R组合键打开“运行” ,输入cmd打开命令提示符或者点击开始→所有程序→附件→命令提示符;
    • 输入diskpart—— 回车“Enter” ,进入diskpart交互环境;
    • 输入lis dis ——回车“Enter” ,显示所有的磁盘,这时会看到两(三)个磁盘,磁盘0和磁盘1,通过磁盘大小识别哪个是要格式化的U盘,例如磁盘1是U盘;
    • 输入sel dis 1 ——回车“Enter” ,选定“磁盘1” ;
    • 输入clean ——回车“Enter” ,删除“磁盘1”下的所有分区;
    • 输入create partition primary ——回车“Enter” ,在磁盘1下创建一个主分区;
    • 输入active ——回车“Enter” ,激活主分区。
  • 安装镜像烧录工具Win32DiskImager-0.9.5-install.exe。解压2021-10-11-raspbian-buster-full-F.7z,打开镜像烧录软件,选择官方系统img,选择SD卡的盘符,这里不能选错,否则会被格式化,如下图配置;
  • 点击Write后会弹出对话框,选择YES,开始烧录。等待烧录完成,拔掉SD卡,插入树莓派上电,系统会自动安装完成;
  • 烧录完成,win系统可能会因为无法识别Linux分区格式而提示用户格式化,此时千万不要点格式化!直接点取消就可以了。如果点了格式化,树莓派会因为丢失系统文件而无法开机,需要重新烧录IMG镜像文件。

1.2.2 常见命令

  • 切换到用户目录: cd
  • 文件编辑:sudo nano
  • 重启:sudo reboot
  • 关机:sudo shutdown -h now 或者 sudo halt
  • 查看当前目录内容:ls
  • 切换到work工作目录:cd work
  • 安装:sudo apt-get install 软件名/安装包
  • 查询树莓派IP:ipconfig

1.3 掌握双色LED和三色LED的编程和接线方式,掌握传感器基本知识

1.3.1 双色LED灯

image 20240623214019709

双基色LED灯。

三种组合:灭、颜色1亮、颜色2亮。

根据颜色组合不同,分为红蓝双色、黄蓝双色、红绿双色。

Python代码:

import RPi.GPIO as GPIO
import time

colors = [0xFF00, 0x00FF, 0x0FF0, 0xF00F] # 颜色列表

import RPi.GPIO as GPIO
import time

colors = [0xFF00, 0x00FF, 0x0FF0, 0xF00F]
makerobo_pins = (11, 12)           # PIN管脚字典
GPIO.setmode(GPIO.BOARD)  # 采用实际的物理管脚给GPIO口
GPIO.setwarnings(False)             # 去除GPIO口警告
GPIO.setup(makerobo_pins, GPIO.OUT)          # 设置Pin模式为输出模式
GPIO.output(makerobo_pins, GPIO.LOW)       # 设置Pin管脚为低电平(0V)关闭LED
p_R = GPIO.PWM(makerobo_pins[0], 2000)   # 设置频率为2KHz
p_G = GPIO.PWM(makerobo_pins[1], 2000)   # 设置频率为2KHz

p_R.start(0)
p_G.start(0)
def makerobo_pwm_map(x, in_min, in_max, out_min, out_max):
               return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
def makerobo_set_Color(col):
               R_val = col  >> 8
               G_val = col & 0x00FF
               # 把0-255的范围同比例缩小到0-100之间
               R_val = makerobo_pwm_map(R_val, 0, 255, 0, 100)
               G_val = makerobo_pwm_map(G_val, 0, 255, 0, 100)
               p_R.ChangeDutyCycle(R_val)     # 改变占空比
               p_G.ChangeDutyCycle(G_val)     # 改变占空比
# 调用循环函数
def makerobo_loop():
    while True:
        for col in colors:
            makerobo_set_Color(col)
            time.sleep(0.5)
# 释放资源
def makerobo_destroy():
    p_G.stop()
    p_R.stop()
    GPIO.output(makerobo_pins, GPIO.LOW)   # 关闭所有LED
    GPIO.cleanup()                          # 释放资源
# 程序入口
if __name__ == "__main__":
    try:
        makerobo_loop()         # 调用循环函数
    except KeyboardInterrupt:            # 当按下Ctrl+C时,将执行destroy()子程序。
        makerobo_destroy()    # 释放资源

占空比:

是指一串理想脉冲序列中,正脉冲的持续时间与脉冲总周期的比值。

调整LED通过电流和不通过电流的时间比来控制,由于人眼有视觉暂留特性,所以只要频率比较高是看不出来闪烁的。当然通过电流比不通过电流的时间比例越大,LED也就越亮。

书上的双色LED实验(C语言)中关键函数:

softPwmCreate()是创建PWM对象并且设置pwm范围用来调速

softPwmWrite()就是送高电平,后面一个参数用来控制运动的速度

1.3.2 三色LED灯

image 20240623214150785

RGB-LED模块中的R、G、B分别代表红、绿、蓝三种原色。

Python代码:

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
61
62
63
64
65
import RPi.GPIO as GPIO
import time
colors =[0xFF0000,0x00FF00,0x0000FF,0xFFFF00,0xFF00FF,0x00FFFF]
makerobo_R =11
makerobo_G =12
makerobo_B =13

#初始化程序
def makerobo_setup ( Rpin , Gpin , Bpin ):
global pins
global p_R,p_G,p_B
pins ={' pin_R ': Rpin ,' pin_G ': Gpin ,' pin_B ': Bpin }
GPIO.setmode (GPIO.BOARD ) #采用实际的物理管脚给GPIO口
GPIO.setwarnings ( False ) #去除GPIO口警告
for i in pins :
GPIO . setup ( pins [ i ], GPIO.OUT )
GPIO . output ( pins [ i ], GPIO.LOW )
p_R = GPIO . PWM ( pins [' pin_R '],2000)
p_G = GPIO . PWM ( pins [' pin_G '],1999)
p_B = GPIO . PWM ( pins [' pin_B '],5000)
#初始化占空比为0(LED关闭)
p_R . start (0)
p_G . start (0)
p_B . start (0)
def makerobo_pwm_map ( x , in_min , in_max , out_min , out_max ):
return ( x - in_min )*( out_max - out_min )/( in_max - in_min )+ out_min

#关闭RGB-LED灯
def makerobo_off ():
GPIO . setmode ( GPIO . BOARD ) #采用实际的物理管脚给GPIO口
for i in pins :
GPIO . setup ( pins [ i ], GPIO . OUT ) #设置Pin模式为输出模式
GPIO . output ( pins [ i ], GPIO . LOW ) #设置Pin管脚为低电平(0V)关闭LED
#设置颜色
def makerobo_set_Color ( col ):
R_val =( col &0xff0000)>>16
G_val =( col &0x00ff00)>>8
B_val =( col &0x0000ff)>>0
R_val = makerobo_pwm_map ( R_val ,0,255,0,100)
G_val = makerobo_pwm_map ( G_val ,0,255,0,100)
B_val = makerobo_pwm_map ( B_val ,0,255,0,100)
p_R.ChangeDutyCycle (100-R_val)
p_G.ChangeDutyCycle (100-G_val)
p_B.ChangeDutyCycle (100-B_val)

#循环函数
def makerobo_loop () :
while True:
for col in colors:
makerobo_set_Color (col) #设置颜色
time.sleep(1) #延时1s
#资源释放
def makerobo_destroy ():
p_R.stop () #关闭红色PWM
p_G.stop () #关闭绿色PWM
p_B.stop () #关闭蓝色PWM
makerobo_off () #关闭RGB-LED灯
GPIO. cleanup () #释放资源
#程序入口
if __name__=="__main__":
try:
makerobo_setup(makerobo_R,makerobo_G,makerobo_B) #初始化设置函数
makerobo_loop () #循环函数
except KeyboardInterrupt: #当按下Ctrl+C,将执行destory()子程序
makerobo_destroy() #资源释放

1.3.3 传感器基本知识

  1. 继电器(基本知识和电路)

    image 20240623225058839 1719154262669 1 副本

    继电器模块是一种电控制器件,当输入量(激励量)的变化达到规定要求时,在电气输出电路中使被控制量发生预定的阶跃变化的一种电器。它具有控制系统(又称输入回路)和被控制系统(又称输出回路)之间的互动关系。通常用于自动化控制电路中,是小电流去控制大电流运作的一种“自动开关”。

    电路原理图:

    image 20240623225318926 1719154402157 3

    image 20240623225347328 1719154429841 5

  2. 干簧管

    image 20240623225456347 1719154499102 7

    干簧管传感器是一种用于检测磁场的传感器。干簧管是干式舌簧管的简称,是一种有触电的无源电子开关元件,具有结构简单,体积小便于控制等优点。其外壳是一根密封的玻璃管,管中装有两个铁质的弹性簧片电板,还灌有一种叫金属铑的惰性气体。

    玻璃管中的两个簧片是分开的,当有磁性物质靠近时,管内两个簧片被磁化而相互吸引接触,两簧片吸合,电路连通;外磁力消失后,两簧片断开,电路断开。

    用途:一种利用磁场信号来控制的线路开关器件,可以用于计数、限位等。

  3. 蜂鸣器(有源和无源)

    声音模块。

    • 有源蜂鸣器

      image 20240623225801982 1719154684548 9

      有源蜂鸣器发出是单一的提示性报警声音,没有频率变化,内置振荡器;

      只要接线,就会发出蜂鸣声。

    • 无源蜂鸣器

      image 20240623225820090 1719154703092 11

      无源蜂鸣器的驱动方式为频率脉冲驱动,可以发出各种有频率的信号声音。

    两者区别:发出的声音不同;驱动的方式不同;应用的场景不同。

    二者接线接法一致。

  4. DS18B20

    image 20240623230351276 1719155033962 13

    DS18B20是单总线接口温度传感器,通过一个IO口即可实现双向通信

    TO-92封装看起来像普通的晶体管。

  5. DHT11

    DHT11是一款有已校准数字信号输出的温湿度传感器。其精度湿度±5%RH,温度±2℃,量程为湿度20-90%RH,温度0-50℃。

    DHT11提供温度和湿度读数,价格低廉精准度高使用简单,并且有python库可以直接导入使用,DHT系列传感器的库可以使用Adafruit DHT,应用也很广泛,在远程气象站、土壤监测器和家庭自动化系统都可以看见它的身影。

  6. 雨滴传感器

    image 20240623231152552 1719155515275 17

    雨滴传感器是用于感应雨水的工具。它由两个模块组成,一个用于检测雨水的防雨板和一个控制模块,该

    模块比较模拟值并将其转换为数字值

    传感器模块包括一个电位计,LM393比较器,LED,电容器和电阻器。上面的引脚图显示了控制模块的组件。雨滴传感器的控制模块具有4个输出。D0引脚连接到微控制器的数字引脚以进行数字输出,也可以使用模拟引脚,使用模拟输出时可以将A0引脚连接到微控制器的ADC引脚。

    LM393上的电位计来检测降雨阈值:顺时针增强灵敏度,逆时针降低灵敏度。

    雨板模块由铜轨组成,铜轨用作可变电阻器。它的阻力随雨板上的湿度而变化。

    应用:雨滴传感器可用于汽车领域以自动控制雨刷器(或自动调整照明模式,自动关闭天窗),可用于农业

    领域以感应雨水,还可用于家庭自动化系统。

  7. 旋转编码器

    image 20240623232331853 1719156214344 21

    旋转编码器是一种位置传感器,用于确定旋转轴的角位置。本实验使用的为增量式旋转编码器,通过旋转生成数字信号

  8. 红外传感器及通信

    image 20240623232633399 1719156395574 23

    红外避障传感器具有一对红外发送和接收传感器。红外LED发出一定频率的红外信号,当障碍物遮挡时,会被接收器应到的障碍物反射回去。

  9. 超声波

    image 20240623232933969 1719156576419 25

    超声波距离传感器内部有两个超声波传感器。一个用来作为发射器,一个作为接收器。可以实现20mm至4000mm之间非接触距离检测

    原理:

    (1)采用IO口TRIG触发测距,给至少10us微秒的高电平信号;

    (2)模块自动发送8个40khz的方波,自动检测是否有信号返回;

    (3)有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。

    (4)测试距离=(高电平时间*声速(340M/S))/2

  10. LCD1602

    液晶显示屏和其他显示器大大的丰富了人机交互,但是当它们连接到控制器时,需要占用大量的I/O口。因此,开发具有有I 2 C总线的LCD1602来解决该问题。

    I 2 C总线是由PHLIPS发明的一种串行总线。它是一种高性能的串行总线,具有多主机系统所需的总线控制和高速或低速设备同步功能。

    I 2 CLCD1602上的蓝色电位器用于调整背光以获得更好的显示效果。

    I 2 C仅使用两个双向漏极开路线,串行数据线(SDA)和串行时钟线(SCL),通过电阻上拉。使用的典型电压为+5V或+3.3V,但允许使用其他电压的系统。

  11. MPU6050测量(加速度、角速度、温度等)

陀螺仪加速度传感器

MPU6050 传感器模块是完整的6轴运动跟踪设备。它结合了三轴陀螺仪三轴加速度计数字运动处理器,均采用小封装。此外,它还具有片上温度传感器的附加功能。它具有12C总线接口,可与微控制器通信。

它具有辅助I2C总线,可与其他传感器设备(例如3轴磁力计,压力传感器等)通信。

如果将3轴磁力计连接到辅助I2C总线,则MPU6050 可提供完整的9轴 Motion Fusion输出。

三轴陀螺仪

image 20240624155232296 1719215554823 7

MPU6050由具有微机电系统(MEMS)技术的三轴陀螺仪组成。如图所示,用于检测沿X、Y、Z轴的旋转速度,当陀螺仪绕任何感测轴旋转时,科里奥利效应会引起MPU6050内部的MEM检测到的振动,结果信号被放大,解调和滤波,以产生与角速度成正比例的电压

三轴加速度计

芯片静置时:

image 20240624155404741 1719215647868 9

产生加速度时:

image 20240624155441952 1719215684330 11

MPU6050包含采用微机电(MEMs)技术的三轴加速度计用于检测沿X、Y、Z轴的倾斜角度。沿轴的加速度会偏移可移动质量,移动板(质量)的这种位移使差分电容器失衡,从而导致传感器输出,输出幅度与加速度成正比

1.4 掌握PCF8591器件的基本知识、通信原理及管脚功能等

1.4.1 A/D模数转换

能将模拟量转换为数字量的电路称为模数转换器,简称A/D转换器或ADC

能将数字量转换为模拟量的电路称为数模转换器,简称D/A转换器或DAC

ADC和DAC是沟通模拟电路和数字电路的桥梁,也可称之为两者之间的接口。

模拟信号只有通过A/D转化为数字信号后才能用软件进行处理,通过A/D转换器或ADC来实现。

image 20240624160705151 1719216427711 13

1.4.2 IIC总线(双向二线制同步串行总线)

主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件

  • 如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送;
  • 如果主机要接收从器件的数据,首先由主器件寻址从器件,然后主机接收从器件发送的数据,最后由主机终止接收过程。

1.4.3 PCF8591

image 20240624170011793 1719219614589 25

PCF8591器件的地址、控制和数据通过两线双向I2C总线传输。器件功能包括多路复用模拟输入、片上跟踪和保持功能、8位模数转换和8位数模拟转换。最大转换速率取决于I2C总线的最高速率。

PCF8591是一款单芯片,单电源,低功耗8位CMOS数据采集设备。

  • 四个模拟输入(AIN0, AIN1, AIN2, AIN3)

  • 一个模拟输出(AOUT)

  • 一个串行I2C总线接口(SDA,SLC)。

  • 三个地址A0,A1和A2用于对硬件地址进行编程(允许使用多达8个连接到I2C总线的设备)

  • VDD:器件内部的工作电压,正电源电压,接电源(2.5V~6V)正极。

  • VCC:接入电路的电压

  • VSS:电路公共接地端电压

  • GND:在电路里常被定为电压参考基点。

AD/DA转换:PCF8591是AINx端口输入模拟电压,然后PCF8591将转换后的数字量通过I2C总线发送给单片机;或是单片机通过I2C总线给一个数字量,然后PCF8591通过AOUT端口将模拟电压输出。

  1. 器件地址

    在I2C总线协议中,在启动条件之后的第一个字节。每一个I 2C器件都有一个器件地址,来区分不同的I 2C设备,

    下面是PCF8591的地址:

    image 20240624163905923 1719218348201 17

    image 20240624163947527 1719218390508 19

    • 它的地址是由1001(固定部分)和A2A1A0(可编程部分)组成的,可编程部分必须按照地址引脚A0,A1,A2进行设置。
    • 地址字节的最后一位是读/写,它设置了数据传输的方式:0表示下一个字节往总线上写数据,1表示下一个字节从总线上读取数据。
    • 在原理图中可以看出,A2A1A0均为0,所以7位器件地址(1001000)为0x48。
  2. 控制字格式

    发送到PCF8591的第二个字节将被存储在其控制寄存器中,并且需要控制器件功能。

    image 20240624164054516 1719218457053 21

    • 最高位默认为0;
    • 第6位是选择是否允许模拟电压输出,在DA转换时设置为1,AD转换时设置为0或1均可;
    • 第5/4位是选择模拟电压输出方式,一般选择00单端输入方式,其他几种方式可以查阅技术手册;
    • 第3位默认为0;
    • 第2位是自动增量使能位,如果自动增量(auto-increment)标志置1,每次A/D 转换后通道号将自动增加;
    • 第1/0位是在AD转换时选择哪一个通道输入的电压转换为数字量;
  3. AD转换应用开发

    • AD的位数:表明这个AD共有2n个刻度,8位AD,输出的刻度是0~255。 8591就是8位精度的,因此它digtal Read的数据在0-255之间。

    • 分辨率:就是AD能够分辨的最小的模拟量变化。假设5.10V的系统用8位的AD采样,那么它能分辨的最小电压就是5.10/255=0.02V。

    • Raspberry PI是“MASTER” ,PCF是“SLAVER” ,他们之间是主从关系。每次数据传输都是由“MASTER”主动开启的。

1.5 OPENCV

1.5.1 掌握Opencv基础应用

  1. 读取、显示、保存图像

    • 读入图像

      1
      cv2.imread(filepath,flags)

      filepath:要读入图片的完整路径

      flags:标志位,,{cv2.IMREAD_COLOR,cv2.IMREAD_GRAYSCALE,cv2.IMREAD_UNCHANGED}。

      cv2.IMREAD_COLOR:默认参数,读入一幅彩色图片,忽略alpha通道,可用1作为实参替代。

      cv2.IMREAD_GRAYSCALE:读入灰度图片,可用0作为实参替代。

      cv2.IMREAD_UNCHANGED:读入完整图片,包括alpha通道,可用-1作为实参替代。

      alpha通道:又称A通道,是一个8位的灰度通道,该通道用256级灰度来记录图像中的透明度信息,定义透明、不透明和半透明区域,其中黑表示全透明,白表示不透明,灰表示半透明程度。

    • 显示图像

      1
      cv2.imshow(wname,img) 

      wname:设置窗口名称;

      img:图片名称。

    • 保存图像

      1
      cv2.imwrite(file,img,num)

      file:要保存的文件名,写出完整路径,路径不能有中文。

      num:对于JPEG,表示的是图像的质量,用0-100的整数表示,默认95;对于png ,表示的是压缩级别,默认为3,从0到9压缩级别越高图像越小。

    • 翻转图像

      1
      cv2.flip(img,flipcode)

      flipcode:控制翻转效果。

      flipcode = 0:沿x轴翻转;

      flipcode > 0:沿y轴翻转;

      flipcode < 0:x,y轴同时翻转。

    • 键盘绑定函数

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      cv2.waitKey()

      if cv2.waitKey(1) & 0xFF == ord('q'):
      break
      cv2.waitKey(1)在有按键按下的时候返回按键的ASCII值,否则返回-1

      & 0xFF的按位与操作只取cv2.waitKey(1)返回值最后八位,因为有些系统cv2.waitKey(1)的返回值不止八位

      ord(‘q’)表示q的ASCII值

      总体效果:按下q键后break

      时间单位为毫秒。当参数为0时,将会无限期的等待键盘输入。

    • 关闭所有建立的窗口

      1
      cv2.destroyAllWindows()
    • 关闭指定窗口

      1
      cv2.destoryWindow(image)

      image:想要关闭的窗口名。

  2. 缩放、剪裁图像

    1
    2
    3
    4
    5
    6
    7
    imgResize = cv2.resize(img1,(500,200))
    print(imgResize.shape)
    cv2.imshow('image Resize',imgResize)

    imgCropped = img1[200:490 , 48:116]
    print(imgCropped.shape)
    cv2.imshow('image Cropped',imgCropped)
  3. 绘制图形

    image 20240624213700056 1719236223513 42

  4. 与视频相关的函数

    • cv2.VideoCapture( ) 获取视频

      参数可以是设备的索引号,或是一个视频文件。

    • ret, frame = cap.read()读取每一帧

      ret:表示是否读取成功;

      frame:表示读取到的每一帧。

    • cap.get(propId) 获取视频的某些参数信息

      propId :代表视频的某种属性,在0 到18 之间的整数取值。

      3-视频流中帧的宽度

      4-视频流中帧的高度

    • cap.set(propId,value) 修改视频的某些参数信息

      propId:视频属性的代表数字;

      value:想要设置成的新值。

    • cv2.VideoWriter(filename, fourcc, fps, frameSize[, isColor] ) 视频保存

      filename:保存文件的文件名;

      fourcc:指定视频编码器的4字节代码;

      fps:帧率;

      frameSize:帧大小,或是一个视频文件;

      isColor:默认为true,如果为true,则视频为彩色,否则为灰度视频

    • fourcc 编码参数:

      cv2.VideoWriter_fourcc(‘X’ , ‘V’ , ‘I’ , ‘D’)—MPEG-4编码类型

      cv2.VideoWriter_fourcc(‘I’ , ‘4’ , ‘2’ , ‘0’)—未压缩的YUV颜色编码

      cv2.VideoWriter_fourcc(‘P’ , ‘I’ , ‘M’ , ‘1’)—MPEG-1编码类型

      cv2.VideoWriter_fourcc(‘T’ , ‘H’ , ‘E’ , ‘O’)—OGGVorbis,音频压缩格式,类似于MP3等的音乐格式

      cv2.VideoWriter_fourcc(‘F’ , ‘L’ , ‘V’ , ‘1’)—FLV是FLASH VIDEO的简称

    • cap.release() 释放视频捕捉器

  5. 读取、播放视频文件

    image 20240624215513392 1719237315915 44

  6. 保存摄像头获取的视频

    image 20240624222433110 1719239076851 48

1.5.1 OpenCV颜色识别

1.RGB色彩模式

是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各种颜色。

在openCV中,像素由BGR三个参数表示,每个参数通常具有0-255之间的值。

2.HSV颜色空间

颜色空间,六角锥体模型

H——色相/色调(hue)

S——饱和度(saturation)

V/B——亮度(value/bringhtness)

opencv中的HSV范围:

H:0——180

S:0—— 255

V:0—— 255

3. 色彩空间转换 cv2.cvtColor(input_image,flag)

input_image:要进行处理的图片。

flag:转换类型。

对于BGR——Gray,flag就是cv2.COLOR_BGR2GRAY;

对于BGR——HSV ,flag就是cv2.COLOR_BGR2HSV。

4. 色彩阀值化处理 cv2.inRange(hsv,lower_range,upper_range)

在图像处理的过程中,使用各种形态学操作或者滤波的方式来突显我们关注的元素,同时降低噪声并减少干扰我们提取关键元素的影响项。

hsv:指的是原图;

lower_range:图像中低于这个lower_range的值,图像值变为0;

upper_range:图像中高于这个upper_range的值,图像值变为0;

在lower_range~upper_range之间的值变成255。

5. 图像ROI

ROI(region of interest),感兴趣区域。机器视觉、图像处理中,从被处理的图像以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域,称为感兴趣区域。ROI通常用来作为图像分类的样本、掩膜、裁剪区或及其他操作。

6. 掩膜(mask)

用选定的图像、图形或物体,对处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程。掩膜的用法如下:

1) 提取感兴趣区:用预先制作的感兴趣区掩膜与待处理图像相乘,得到感兴趣区图像,感兴趣区内图像值保持不变,而区外图像值都为0;

2) 屏蔽作用:用掩膜对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计;

3)结构特征提取:用相似性变量或图像匹配方法检测和提取图像中与掩膜相似的结构特征;

4)特殊形状图像的制作。

7. cv2.bitwise_and(src1, src2, dst=None, mask=None)

src1、src2:为输入图像或标量,标量可以为单个数值或一个四元组。

dst:可选输出变量,如果需要使用非None则要先定义,且其大小与输入变量相同。

mask:图像掩膜,可选参数,为8位单通道的灰度图像,用于指定要更改的输出图像

数组的元素,即输出图像像素只有mask对应位置元素不为0的部分才输出,否则该位置

像素的所有通道分量都设置为0。

返回值为结果图像矩阵,如果dst传入了实参,则返回值与dst对应实参相同。

1.5.2 物体位置颜色识别流程

1.5.2.1 物体位置检测

相关库函数—— print_function

from _ future _ import print_function

image 20240625150349712 1719299031920 11

在代码开头加上

1
from __future__ import print_function

这句之后,可以在python2.X中按照python3.X的方法使用这些函数。

相关库函数–VideoStream

1
2
import imutils
from imutils.video import VideoStream

使用imutils工具包的VideoStream类读取视频流

1
2
3
vs = VideoStream(0).start() #打开摄像头

frame = vs.read() #读取一帧图像
1
2
3
4
camera = cv2.VideoCapture(0) #打开摄像头
参数可以是设备的索引号,或是一个视频文件。
(grabbed, frame) = camera.read() #读取一帧图像
(是否读取成功,读取到的每一帧)

BGR转换HSV

1
cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

RGB图像与相机传感器输出的原始数据相对应;

HSV图像则更符合人眼的直观视觉。

因此处理图像时,往往先将RGB图像转换为HSV图像,在HSV色彩空间对图像进行处理,

处理完毕后再将HSV图像转换为RGB图像。

指定ROI

1
cv2.inRange(hsv, colorLower, colorUpper)

为图片指定感兴趣区域ROI(region of interest)

指定ROI后,再进行掩膜、裁剪等操作。

图像形态学处理

形态学处理主要从图像内提取分量信息,该分量信息通常对于表达和描绘图像的形状具有重要意义,通常是图像理解时所使用的最本质的形状特征。

图像滤波

原图像上存在很多和周围像素差距过大的像素点,

这种噪声点可能会对之后搜索图像关键因素产生干扰。

图像常见噪声:高斯噪声,泊松噪声,乘性噪声,椒盐噪声

高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。如果噪声幅度分布服从高斯分布,而它的功率谱密度又是均匀分布的,则称它为高斯白噪声

产生原因:

1)图像传感器在拍摄时市场不够明亮、亮度不够均匀;

2)电路各元器件自身噪声和相互影响;

3)图像传感器长期工作,温度过高。

图像处理中常用的滤波算法有均值滤波、中值滤波以及高斯滤波等。

image 20240625151817812 1719299899896 17

  • 高斯滤波

    高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。

    线性滤波可以说是图像处理最基本的方法,它可以允许我们对图像进行处理,产生很多不同的效果。做法很简单。首先,我们有一个二维的滤波器矩阵(有个高大上的名字叫卷积核)和一个要处理的二维图像。然后,对于图像的每一个像素点,计算它的邻域像素和滤波器矩阵的对应元素的乘积,然后加起来,作为该像素位置的值。这样就完成了滤波过程。

    1.离散化窗口滑窗卷积

    2.傅里叶变换

    1
    2
    3
    4
    5
    cv2.GaussianBlur(src,ksize,sigmaX)
    # src:原始图像
    # ksize:核大小,奇数
    # sigmaX:X方向方差;Y方向方差与X保持一致
    sigma = 0.3*((ksize-1)*0.5-1)+0.8

image 20240625152147017 1719300109455 19

每个像素点所占的权重不一样,距离越近,权重越大,距离越远,权重越小。

sigmaX越小,图像平滑越不明显。

通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程。

每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。

图像腐蚀加上高斯模糊,可以使得图像的色彩更加突出,少了很多的颜色干扰,色彩追踪更加精准。

查找轮廓

1
2
3
4
5
image,contours,hierarchy = cv2.findContours( binary_image,	#要查找轮廓的图像

mode=cv2.RETR_EXTERNAL, #只检测外轮廓

method=cv2.CHAIN_APPROX_SIMPLE) #只保留重点坐标

返回值:

image :可能输出与binary_image类似的二值图像。—opencv-python 4.x中已去掉该参数

contours:一个列表,list中每个元素都是图像中的一个轮廓,用numpy中的ndarray表示。

hierarchy:一个ndarray, 每条轮廓对应的属性

计算轮廓面积并取最大

1
double contourArea(InputArray contour, bool oriented = false); # 计算轮廓的面积

contour,输入的二维点集(轮廓顶点),可以是 vector 或 Mat 类型。

oriented,面向区域标识符。有默认值 false。若为 true,该函数返回一个带符号的面积值, 正负取决于轮廓的方向(顺时针还是逆时针)。若为 false,表示以绝对值返回。

image 20240625153030509 1719300633215 21

key关键字的作用:对每个cnts元素先使用key指定的function来处理,然后再比较、返回预期的元素。

最小外接圆

image 20240625153107908 1719300670416 23

使用迭代算法查找包含轮廓的最小区域圆。

返回值:圆心坐标与半径。

返回圆应满足:

① 轮廓上的点均在圆形空间内。

② 没有面积更小的满足条件的圆。

物体位置识别代码流程

image 20240625153307349 1719300789737 25

1.5.2.2 可选颜色球状物体追踪

原理:视频图像(HSV)各通道进行阈值分割后进行融合,在融合后的图像中检测出圆形并进行追踪。

过程:

1.图像转换到HSV空间,并按照通道进行分割;

​ 1)色彩空间转换

​ hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)

​ 2)通道分割

​ hue,sat,val = cv2.split(hsv)

2、根据选定阈值,各通道图像去除背景部分

hthresh =cv2.inRange(np.array(hue),np.array(hmn),np.array(hmx))

sthresh = cv2.inRange(np.array(sat),np.array(smn),np.array(smx))

vthresh = cv2.inRange(np.array(val),np.array(vmn),np.array(vmx))

3、将H、S、V通道图像进行与运算

tracking = cv2.bitwise_and(hthresh,cv2.bitwise_and(sthresh,vthresh))

4、对融合后的图像进行形态学处理和滤波

kernel = np.ones((5,5),np.uint8)

dilation = cv2.dilate(tracking,kernel,iterations = 1)

closing = cv2.morphologyEx(dilation, cv2.MORPH_CLOSE, kernel)

closing = cv2.GaussianBlur(closing,(5,5),0)

5、检测出圆形

cv2.HoughCircles(closing,cv2.HOUGH_GRADIENT,2,120,param1=120,param2=50,minRadius=10,maxRadius=0)

函数:cv2.HoughCircles(image, method, dp, minDist[, circles[,param1[, param2[, minRadius[, maxRadius]]]]])

​ dp 为检测内侧圆心的累加器图像的分辨率于输入图像之比的倒数,如dp=1,累加器和输入图像具有相同的分辨率,如果dp=2,累计器便有输入图像一半那么大的宽度和高度。

​ param1有默认值100,它是method设置的检测方法的对应的参数,对当前唯一的方法霍夫梯度法cv2.HOUGH_GRADIENT,它表示传递给canny边缘检测算子的高阈值,而低阈值为高阈值的一半。

​ param2有默认值100,它是method设置的检测方法的对应的参数,对当前唯一的方法霍夫梯度法cv2.HOUGH_GRADIENT,它表示在检测阶段圆心的累加器阈值,它越小,就越可以检测到更多根本不存在的圆,而它越大的话,能通过检测的圆就更加接近完美的圆形了,所以要根据检测圆的大小变化 。

OpenCV中的CV2.HoughCircles()函数实现了圆形检测,它使用的算法也是改进的霍夫变换——2-1霍夫变换(21HT)。也就是把霍夫变换分为两个阶段,从而减小了霍夫空间的维数。第一阶段用于检测圆心,第二阶段从圆心推导出圆半径

检测圆半径的方法是从圆心到圆周上的任意一点的距离(即半径)是相同,只要确定一个阈值,只要相同距离的数量大于该阈值,我们就认为该距离就是该圆心所对应的圆半径。

6、将检测出的圆形画出来。

1.5.2.3 颜色物体追踪

1. 相关库函数–collections

  • deque

是”double ended queue”的缩写,双端队列,队首和队尾都支持元素的插入和弹出.

使用原因:

全局锁GIL(Global Interpreter Lock)的管理,它是线程安全的。而list则没有GIL锁,因此不是线程安全的。也就是说在并发场景下,list可能会导致一致性问题,而deque不会。

deque支持固定长度,当长度满了之后,当我们继续append时,它会自动弹出最早插入的数据。

使用:

1).创建deque序列

deque(maxlen=N),创建了一个固定长度的队列,当有新的记录加入而队列已满时会自动移动除最老的那条记录。maxlen可以省略

2).deque序列的入队和出队

1)单个数据入队

append(item),添加一个数据到队列的尾部。与列表的append()方法功能相似。

appendleft(item),添加一个数据到队列的头部。与append()的添加方向相反。

2)可迭代对象入队

extend(iterable),将一个可迭代对象中的数据按顺序添加到队列的尾部。

Iterable:list,tuple,dic,string,set 等

3)指定位置插入数据

insert(index, item),在队列中的指定位置插入一个数据,index为指定的位置索引。

4)队列两端的出队方法

pop(),将队列尾部的数据弹出,并作为返回值。

popleft(),将队列头部的数据弹出,并作为返回值。

2.相关库函数–argparse

argparse是一个用来解析命令行参数的 Python 库,它是 Python 标准库的一部分。argparse 模块使编写用户友好的命令行界面变得容易。程序定义了所需的参数,而 argparse 将找出如何从 sys.argv (命令行)中解析这些参数。argparse 模块还会自动生成帮助和使用消息,并在用户为程序提供无效参数时发出错误

使用argparse的主要步骤:

  1. 导入argparse包;

  2. 创建ArgumentParser()参数对象;

  3. 调用add_argument()方法往参数对象中添加参数;

  4. 使用parse_args()解析添加参数的参数对象,获得解析对象;程序的其他部分需要使用命令行参数时,用解析对象.参数获取。

重要参数:

description——在参数帮助文档之前显示的文本(默认值:无)

name or flags——一个命名或者一个选项字符串的列表

default——当参数未在命令行中出现并且也不存在于命名空间对象时所产生的值

3.相关库函数–imutils

imutils是Adrian Rosebrock开发的一个python工具包,它整合了opencv、numpy和matplotlib的相关操作,主要是用来进行图形图像的处理,如图像的平移、旋转、缩放、骨架提取、显示等等,后期又加入了针对视频的处理,如摄像头、本地文件等。

安装imutils:pip install imutils

imutils常用函数使用:

1).图像平移

imutils.translate(img,x,y)

参数:

img:要移动的图像

x:沿x轴方向移动的像素个数

y: 沿y轴方向移动的像素个数

2).图像缩放

imutils.resize(img,width=100),自动保持原有图片的宽高比,只指定宽度weight和height即可。

3).图像旋转

在OpenCV中进行旋转时使用的是仿射变换(向量空间:线性变换+平移),在这里图像旋转方法是imutils.rotate(),跟2个参数,第一个是图片数据,第二个是旋转的角度,旋转是朝逆时针方向。同时imutils还提供了另一个相似的方法, rotate_round(),它就是按顺时针旋转的。

示例:

逆时针旋转

rotated = imutils.rotate(image, 90)

顺时针旋转

rotated_round = imutils.rotate_bound(image, 90)

4).骨架提取(边缘提取)

骨架提取(边缘提取),是指对图片中的物体进行拓扑骨架(topologicalskeleton)构建的过程。imutils提供的方法是skeletonize(),第二个参数是结构参数的尺寸(structuring element),相当于是一个粒度,越小需要处理的时间越长。可以设置为 (3,3)。

示例:

skeleton = imutils.skeletonize(gray, size=(7, 7))

image 20240625195059307 1719316262054 37

5).转RGB,使用Matplotlib显示

在OpenCV的Python绑定中,图像以BGR顺序表示为NumPy数组。使用该cv2.imshow功能时效果很好。

但是,如果打算使用Matplotlib,该plt.imshow函数将假定图像按RGB顺序排列。调用cv2.cvtColor解决此问题,也可以使imutils中opencv2matplotlib便捷功能。

image 20240625200952227 1719317394408 39

4.搜索轮廓

image,contours,hierarchy = cv2.findContours( binary_image, mode=cv2.RETR_TREE, method=cv2.CHAIN_APPROX_SIMPLE)

(1)输入参数:

binary_image:带有轮廓信息的二值图像

mode=cv2.RETR_TREE:提取轮廓后,输出轮廓信息的组织形式。

method=cv2.CHAIN_APPROX_SIMPLE:指定轮廓的近似办法

(2)轮廓检索方式 mode:

cv2.RETR_EXTERNAL只检测外轮廓

cv2.RETR_LIST检测的轮廓不建立等级关系

cv2.RETR_CCOMP建立两个等级的轮廓,上面一层为外边界,里面一层为内孔的边界信息

cv2.RETR_TREE建立一个等级树结构的轮廓

主要影响的是提取轮廓及轮廓间关系。

(3)轮廓的近似办法 method:

cv2.CHAIN_APPROX_NONE:存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1。

cv2.CHAIN_APPROX_SIMPLE:压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息

主要影响存储的轮廓点数

(4)输出参数:

image :可能输出与binary_image类似的二值图像。—opencv-python 4.x中已去掉该参数

contours:一个列表,list中每个元素都是图像中的一个轮廓,用numpy中的ndarray表示。

hierarchy:一个ndarray, 每条轮廓对应的属性。

Hierarchy:

第一个数:表示同一级轮廓的下个轮廓的编号,如果这一级轮廓没有下一个轮廓,一般是这一级轮廓的最后一个的时候,则为-1。

第二个数:表示同一级轮廓的上个轮廓的编号,如果这一级轮廓没有上一个轮廓,一般是这一级轮廓的第一个的时候,则为-1。

第三个数:表示该轮廓包含的下一级轮廓的第一个的编号,假如没有,则为-1。

第四个数: 表示该轮廓的上一级轮廓的编号,假如没有上一级,则为-1。

5.图像矩

图像矩(Image moments)是指图像的某些特定像素灰度的加权平均值(矩),或者是图像具有类似功能或意义的属性。

图像矩通常用来描述分割后的图像对象。可以通过图像的矩来获得图像的部分性质,包括面积(或总体亮度),以及有关几何中心和方向的信息 。

将图像看成一个平板,每个像素点的值看成是该处的密度,对某点求期望就是该图像在该点处的。一般图像矩指原点矩。零阶矩表示一团像素的像素值之和,一阶矩表示横坐标和对应像素值的乘积和纵坐标和对应像素值的乘积,一阶矩和零点矩可以计算某个形状的重心,二阶矩可以计算形状的方向

1.5.3 二维码识别

二维码又称二维条形码,常见的二维码类型有二维码与条形码。

二维码(QRcode)与条形码(Bar Code)都是将特定的几何图形按照一定的编码规则在平面上分布的记录数据信息的黑白相间的符号图像。

信息表达方式的差异:

image 20240625140645654 1719295609258 1

结构上的差异:

一维条形码的前端和末端有起始符和终止符,配合上固定的高度完成光电扫描设备对其位置的确定。

二维码位置的确定是利用处在边缘位置的定位矩形,可以方便的利用透视变换从而达到更快速更准确的定位和识别。

  • 代码编制:

其思想是将构成计算机内部逻辑的“0”“1”比特流映射成黑白相间的几何形体,这些几何形体按照一定的规律在二维平面上分布就可以通过图像输入设备或者光电扫描设别自动识读以实现信息的自动处理。

  • 二维码识别核心库的导入:

ZBar:

检测和解码不同类型的条形码和二维码的推荐库

安装命令: sudo apt-get install libzbar0

pyzbar:

python使用的第三方模块

安装命令:sudo pip install zbar

  • 视频流对象的创建以及预处理

首先使用imutils.video库中的VideoStream唤醒摄像头并创建视频流对象,使用usb插口连接单个摄像头模组默认的src为0

1
2
3
4
5
print("[INFO] starting video stream...")

vs = VideoStream(src=0).start()

time.sleep(2.0)

接下来使用resize方法对视频流中的每一帧进行裁剪的预处理,一般我们把每一帧的大小限定在(400×300)px以内

1
2
3
frame = vs.read()

frame = imutils.resize(frame , width=400)
  • pyzbar的核心函数decode()

decode函数能对视频流进行识别处理,返回一组具有识别信息属性的对象

1
barcodes = pyzbar.decode(frame)

rect属性:记录了识别到的条形码或二维码在对应帧中的位置信息。对于QR码是左上角像素点的横纵坐标,以及QR码边界点的长度和高度。

1
(x,y,w,h) = barcode.rect

type属性:返回值是ZBar能够读取的条码的编码类型。

data属性:返回值是嵌入在检测到的符号内的数据。通常是字母数字,但其他类型也有效,可以指定其编码类型。

1
2
3
barcodeData = barcode.data.decode("utf-8")

barcodeType = barcode.type
  • 使用cv2的基本操作对识别结果进行可视化处理

    • 框选二维码所在的位置

      利用rectangle函数配合rect属性在对应位置画出矩形

      1
      2
      3
      (x,y,w,h)=barcode.rect

      cv2.rectangle(frame, (x,y) , (x+w,y+h) , (0 ,0 ,255) ,2)
    • 文本信息的展示

      利用putText函数将data属性和type属性以文本的形式在合适位置处展示出来

      image 20240625144638108 1719298000606 3

  • 辅助功能的实现

    • 使用argparse库制作命令函接口:

      利用ArgumentParser返回的对象的add_argument方法添加命令行选项

      image 20240625144724207 1719298046168 5

    • 历史识别结果的记录:

      利用write函数将识别到二维码的时刻以及二维内部存储的信息写入到csv文件中

1.5.4 人脸检测的基础知识和重点函数

1. 人脸检测

人脸检测:指对于任意一幅给定的图像/视频帧,采用一定的策略对其进行搜索以确定其中是否含有人脸,如果是则返回一脸的位置、大小和姿态。(有没有人脸)

人脸识别:基于人的脸部特征信息进行身份识别的一种生物识别技术。(是谁的脸)、

2.Haar特征分类器

以Haar特征分类器为基础的对象检测技术是一种非常有效的对象检测技术。它是基于机器学习的,使用大量的正负样本训练得到分类器。

Haar分类器 = Haar-like特征 + 积分图⽅法 + AdaBoost + 级联

  • Haar分类器算法的要点如下:

① 使⽤Haar-like特征做检测。

② 使⽤积分图(Integral Image)对Haar-like特征求值进行加速。

③ 使⽤AdaBoost算法训练区分⼈脸和非人脸的强分类器。

④ 使⽤筛选式级联把强分类器级联到⼀起,提高准确率。

OpenCv中,Haar特征分类器就是一个XML文件,是opencv官⽅训练好的检测器,可以直接调⽤。

  • Haar特征分类器存放目录:

OpenCV安装目录中的.\opencv\sources\data\ haarcascades目录下。

xml中存放的是训练后的特征池,特征size大小根据训练时的参数而定,检测的时候可以简单理解为就是将每个固定size特征(检测窗口)与输入图像的同样大小区域比较,如果匹配那么就记录这个矩形区域的位置,然后滑动窗口,检测图像的另一个区域,重复操作。

  • haar分类器加载

加载分类器:需要将分类器.xml文件复制到所建项目的可运行文件夹内

image 20240625154508529 1719301510579 27

CascadeClassifier为OpenCV中用来做目标检测的级联分类器的一个类。

该类中封装的目标检测机制,简而言之是滑动窗口机制+级联分类器的方式。

在使用这个检测时,需要传入对应的模型文件。

3.detectMultiScale( )函数

  • 当用训练好的模型去检测图像时,会用detectMultiScale()函数来对图像进行多尺度检测。

  • detectMultiScale()函数检测出图片中的所有人脸,并用vector类型保存各个人脸的位置和大小,用矩形Rect类表示。

  • 该函数由分类器的对象进行调用。

image 20240625154929455 1719301771434 29

image 20240625154937744 1719301779724 31

  • detectMultiScale( )参数定义

    image 20240625155148025

    1.const Mat& image:输入图像

    2.vector& objects:输出的矩形向量组

    3.double scaleFactor=1.1:这个是每次缩小图像的比例,默认是1.1

    4.minNeighbors=3:匹配成功所需要的周围矩形框的数目,默认值是3,即每一个目标至少要被检测到3次才算

    是真的目标。

    5.flags=0:可以取如下这些值:

    CASCADE_DO_CANNY_PRUNING=1, 利用canny边缘检测来排除一些边缘很少或者很多的图像区域

    CASCADE_SCALE_IMAGE=2, 正常比例检测

    CASCADE_FIND_BIGGEST_OBJECT=4, 只检测最大的物体

    CASCADE_DO_ROUGH_SEARCH=8 初略的检测

    6.minObjectSize maxObjectSize:匹配物体的大小范围

由于输入的图像中特征大小不定,比如在输入图像中眼睛是50x50的区域,而训练时的是25x25,那么只有当输入图像缩小到一半的时候,才能匹配上,所以这里还有一个逐步缩小图像,也就是制作图像金字塔的流程

缩小因子会根据原图片按金字塔模型等比例缩小,然后在缩小后的图片上继续检测人脸。

灰度图不但保存原色彩图的特征,而且减少运算量,加快检测速度。

4.人脸检测流程

image 20240625155651713 1719302214458 33

1.5.5 openCV形态学处理方法

主要用于从图像中提取对表达和描绘区域形状有意义的图像分量,使后续的识别工作能够抓住目标对象最为本质的形状特征,如边界和连通区域等。

形态学的基本思想是利用一种特殊的结构元来测量或提取输入图像中相应的形状或特征,以便进一步进行图像分析和目标识别。

形态学处理主要从图像内提取分量信息,该分量信息通常对于表达和描绘图像的形状具有重要意义,通常是图像理解时所使用的最本质的形状特征。

腐蚀 (erode)(morphologyEx – MORPH_ERODE)

膨胀 (dilate)(morphologyEx – MORPH_DILATE)

开运算 (morphologyEx – MORPH_OPEN)

闭运算 (morphologyEx – MORPH_CLOSE)

梯度运算 (morphologyEx – MORPH_GRADINET)

礼帽运算 (morphologyEx – MORPH_TOPHAT)

黑帽运算 (morphologyEx – MORPH_BLACKHAT)

  • 腐蚀 erode

    腐蚀操作是对所选区域进行“收缩”的一种操作,可以用于消除边缘和杂点。腐蚀区域的大小与结构元素的大小和形状相关。其原理是使用一个自定义的结构元素,如矩形、圆形等,在二值图像上进行类似于“滤波”的滑动操作,然后将二值图像对应的像素点与结构元素的像素进行对比,得到的交集即为腐蚀后的图像像素。

    经过腐蚀操作,图像区域的边缘可能会变得平滑,区域的像素将会减少,相连的部分可能会断开。即使如此,各部分仍然属于同一个区域。

    image 20240625202549457 1719318352025 41

  • 膨胀 dilate

    与腐蚀相反,膨胀是对选区进行“扩大”的一种操作。其原理是使用一个自定义的结构元素,在待处理的二值图像上进行类似于“滤波”的滑动操作,然后将二值图像对应的像素点与结构元素的像素进行对比,得到的并集为膨胀后的图像像素。

    经过膨胀操作,图像区域的边缘可能会变得平滑,区域的像素将会增加,不相连的部分可能会连接起来,这些都与腐蚀操作正好相反。即使如此,原本不相连的区域仍然属于各自的区域,不会因为像素重叠就发生合并

    image 20240625202855296 1719318537885 43

  • 开运算

    先腐蚀,后膨胀(去毛刺)

    消除图像上细小的噪声,并平滑物体的边界

    去除孤立的、细小的点,平滑毛糙的边缘线,同时原区域面积也不会有明显的改变,类似于一种“去毛刺”的效果。

    image 20240625151412557 1719299654694 13

  • 闭运算

    先膨胀,后腐蚀(填空隙)

    填充物体内细小的空洞,并平滑物体边界

    将看起来很接近的元素,如区域内部的空洞或外部孤立的点连接成一体,区域的外观和面积也不会有明显的改变。类似于“填空隙”的效果。

    image 20240625151512265 1719299714979 15

1.5.6 图像掩模概念

掩膜(mask)

用选定的图像、图形或物体,对处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程。用于覆盖的特定图像或物体称为掩模或模板。光学图像处理中,掩模可以是胶片、滤光片等。数字图像处理中,掩模为二维矩阵数组,有时也用多值图像。

掩膜就是两幅图像之间进行的各种位运算操作。

掩膜的用法如下:

1) 提取感兴趣区:用预先制作的感兴趣区掩膜与待处理图像相乘,得到感兴趣区图像,感兴趣区内图像值保持不变,而区外图像值都为0;

2) 屏蔽作用:用掩膜对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计;

3)结构特征提取:用相似性变量或图像匹配方法检测和提取图像中与掩膜相似的结构特征;

4)特殊形状图像的制作

1.5.7 基本、键盘等待输入函数、色彩空间范围、OpenCV视频参数修改

  • Title: 电子技术实习期末复习
  • Author: Volcano
  • Created at : 2024-07-05 15:37:22
  • Updated at : 2024-07-05 16:16:58
  • Link: https://volcano-can.space/2024/07/05/电子技术实习期末复习/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments