#学习笔记 #OpenCV #人脸识别 #Python #图像处理

开始

这个教程是照着 B 站视频 https://www.bilibili.com/video/BV1Lq4y1Z7dm 做的
很多地方有改动

图像读取与显示

先来点基础的,读取图像并显示
Pycharm 先创建一个 Project,一个 Project 其实就是一个放代码的文件夹,先创建一个 py 文件命名为……什么都可以

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import cv2 as cv  

def RandS():
# 读取图片
img = cv.imread('DaBian1.png')
# 显示图片
cv.imshow('Hao Jing', img)
# 等待
cv.waitKey(0)
# 关闭窗口
cv.destroyAllWindows()

if __name__ == '__main__':
RandS()

需要注意的地方

  1. 图片最好放你工程文件夹里,如果和你的 py 在一个文件夹里那直接写文件名. 后缀名就可以,如果在别的文件夹里就需要改为 ./folder/DaBian1.png
  2. 按键就可以关闭窗口,要是点图片右上角叉号退出是不会结束进程的,下次执行需要点右上角红色小方块停止运行
    执行结果

导入 OpenCV

1
import cv2 as cv  

如果导不进去或者是没有代码提示肯定是配置有毛病,需要进行漫长的排除问题的过程~

读取图片

1
cv.imread('DaBian1.png')  

这是读取一个文件,返回到图片的矩阵 img
如果想看可以 print(img)

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
[[[ 82  97 135]
[ 82 97 134]
[ 82 96 134]
...
[104 162 248]
[103 161 248]
[103 160 248]]

[[ 81 96 135]
[ 81 96 135]
[ 81 95 134]
...
[104 161 250]
[103 160 251]
[103 159 251]]

[[ 81 95 135]
[ 81 95 135]
[ 81 95 134]
...
[104 160 251]
[103 159 251]
[103 159 252]]

...

[[ 87 99 151]
[ 88 99 151]
[ 88 99 151]
...
[114 82 90]
[115 81 89]
[115 81 89]]

[[ 88 99 151]
[ 88 99 151]
[ 88 99 151]
...
[113 81 89]
[114 81 89]
[115 81 89]]

[[ 88 100 151]
[ 88 100 151]
[ 88 100 151]
...
[111 81 89]
[113 81 89]
[115 81 89]]]

Process finished with exit code 0

这就是执行结果,这就是图片

显示图片

1
2
# 显示图片  
cv.imshow('Hao Jing', img)

第一个参数 'Hao Jing' 是窗口上的名称,字符串格式
第二个则是 img,是图片的矩阵,就是上面那一大长串

等待

1
2
# 等待  
cv.waitKey(0)

返回的是按键,里面的 0 代表一直等着用户按键,可以基于这个弄一个按指定按键关闭~
不加这一行的话图片闪一下就关了

关闭窗口

1
2
# 关闭窗口  
cv.destroyAllWindows()

就是关闭窗口

图片的灰度处理

需要人脸识别的时候是需要把图像处理为灰度的

灰度就是… 灰的,没有 RGB 的信息,每一个像素之有 0 到 255 的值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import cv2 as cv  

def RandS():
# 读取图片
img = cv.imread('DaBian1.png')
# 灰度转换
gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 显示图片
cv.imshow('Hao Jing_gray', gray_img)
# 保存灰度图片
cv.imwrite('Hao Jing_gray.jpg', gray_img)
# 等待
cv.waitKey(0)
# 关闭窗口
cv.destroyAllWindows()

if __name__ == '__main__':
RandS()

执行结果


昊————京————

灰度转换

1
2
# 灰度转换  
gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

其中 cv.cvtColor(img, cv.COLOR_BGR2GRAY) 是负责转换颜色的,第一个是原图的图片矩阵,第二个是转换的模式,其中 cv.COLOR_BGR2GRAY 就是 BGR to GRAY 字面意思,需要注意的是在 OpenCV 里很多时候 RGB 是以 BGR 的顺序显示的

图片保存

1
2
# 保存灰度图片  
cv.imwrite('Hao Jing_gray.jpg', gray_img)

第一个是路径文件名 第二个是矩阵

更改图片大小

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import cv2 as cv  

def RandS():
# 读取图片
img = cv.imread('rickroll1.png')
# 修改尺寸
resize_img = cv.resize(img, dsize = (200, 200))
# 显示图片
cv.imshow('Rick', img)
# 显示修改后的
cv.imshow('Resized Rick', resize_img)
# 打印原图片大小
print('Normal', img.shape)
# 打印修改后的大小
print('Resized', resize_img.shape)
# 等待
while True:
if ord('q') == cv.waitKey(0):
break
# 释放内存
cv.destroyAllWindows()

if __name__ == '__main__':
RandS()

执行结果是两个图片

1
2
3
4
Normal (983, 1375, 3)
Resized (200, 200, 3)

Process finished with exit code 0

从打印出的数据可以看到,图片从 (983, 1375, 3) 更改为 (200, 200, 3)
其中:

  • 983, 1375 代表着长宽,图片的大小
  • 3 代表着 BGR 三种颜色

修改图片尺寸

1
2
# 修改尺寸  
resize_img = cv.resize(img, dsize = (200, 200))

把矩阵 img 的大小改变,放进 resize_imgdsize = (200, 200) 为大小,长宽为 200 200

绘制图形

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import cv2 as cv  

def draw_rectangle():
# 读取图片
img = cv.imread('the_wicher3_3.jpg')
# 坐标
x,y,w,h = 100,100,100,100
# 绘制矩形
cv.rectangle(img, (x, y), (x+w, y+h), color = (0,0,255), thickness=1)
# 绘制圆形
cv.circle(img, center=(x+w, y+h),radius=100,color= (255,0,0), thickness=5)
# 显示
cv.imshow('draw_rec and cir', img)
# 等待
while True:
if ord('q') == cv.waitKey(0):
break
# 释放内存
cv.destroyAllWindows()

if __name__ == '__main__':
draw_rectangle()

执行结果:

绘制矩形与圆形

1
2
3
4
# 绘制矩形  
cv.rectangle(img, (x, y), (x+w, y+h), color = (0,0,255), thickness=1)
# 绘制圆形
cv.circle(img, center=(x+w, y+h),radius=100,color= (255,0,0), thickness=5)

cv. rectangle (图形, 一个点坐标, 另一个点坐标, 颜色, 线条宽度)
cv. circle (图形, center=圆心, radius=半径, color= (255, 0, 0), thickness=线条宽度)