#学习笔记 #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()
|
需要注意的地方
- 图片最好放你工程文件夹里,如果和你的 py 在一个文件夹里那直接写文件名. 后缀名就可以,如果在别的文件夹里就需要改为
./folder/DaBian1.png
- 按键就可以关闭窗口,要是点图片右上角叉号退出是不会结束进程的,下次执行需要点右上角红色小方块停止运行
执行结果

导入 OpenCV
如果导不进去或者是没有代码提示肯定是配置有毛病,需要进行漫长的排除问题的过程~
读取图片
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
,是图片的矩阵,就是上面那一大长串
等待
返回的是按键,里面的 0 代表一直等着用户按键,可以基于这个弄一个按指定按键关闭~
不加这一行的话图片闪一下就关了
关闭窗口
就是关闭窗口
图片的灰度处理
需要人脸识别的时候是需要把图像处理为灰度的
灰度就是… 灰的,没有 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_img
,dsize = (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=线条宽度)