基于OpenCV库的人脸识别实战(1)
本文为大一人工智能专业学生,本文仅为个人学习路线的记录,如有问题或疏漏,欢迎指正!如有侵权请联系我个人微信:GZE08_myh
首次发布时出现缩进错误,现已更改
OpenCV插件的安装
1、安装opencv-python
pip install opencv-python
pip install opencv-python -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
2、安装opencv-contrib-python
pip install opencv-contrib-python
pip install opencv-contrib-python -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
3、安装 pytesseract
pip install pytesseract
ip install pytesseract -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
另外,需要确保numpy、pandas、matplotlib已经安装
4.1 显示图片
写一个简单的测试程序,显示一张图片
(“lena.jpg为工程文件夹中的图片,也可以用路径path代替”)
参考代码:
# 导入模块
import cv2 as cv
# 读取图片
img = cv.imread('lena.jpg') # 路径中不建议包含中文
# 显示图片
cv.imshow('img', img)
# 等待键盘输入 参数单位毫秒 表示等待时间 0表示无限等待
cv.waitKey(3000)
# 释放内存 OpenCV底层调用的是C++
cv.destroyAllWindows()
4.2 图片转灰度
彩色图片在OpenCV中的三个通道:BGR(蓝、绿、红)
为了降低图像识别的难度,通常会转换为灰度图,实际上就是把三个通道合成一个通道,
需要调用一个函数 cvtColor()
参考代码:
import cv2 as cv
img = cv.imread('lena.jpg') # 路径中不建议包含中文
cv.imshow('img', img)
# 将图片转换成灰度
gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
cv.imshow('gray_img', gray_img)
# 把灰度图片保存下来
cv.imwrite('gray_lena.jpg', gray_img)
cv.waitKey(0)
cv.destroyAllWindows()
效果如下:

4.3 修改图片尺寸
使用 resize() 修改图片尺寸
参考代码:
import cv2 as cv
img = cv.imread('lena.jpg') # 路径中不建议包含中文
cv.imshow('img', img)
print('原来图片的形状:', img.shape)
# 修改图片大小
resize_img = cv.resize(img, dsize=(400, 200))
cv.imshow('resize_img', resize_img)
print('修改后图片的形状:', resize_img.shape)
cv.waitKey(0)
cv.destroyAllWindows()
效果如下:

4.4 在图片上绘制矩形和圆
绘制矩形使用 rectangle() 方法
rectangle(img, pt1, pt2, color, thickness)
参数1:img。在哪个图片上绘制矩形
参数2:pt1。左上角的点,作为一个元组,里面包含2个值
参数3:pt2。右下角的点。作为一个元组,里面包含2个值
参数4:color。矩形的颜色(BGR颜色)。作为一个元组,里面包含3个值,分别为BGR
参数5:thickness。矩形框的厚度
绘制圆使用 circle() 方法
circle(img, center, radius, color, thickness)
参数1:img。在哪个图片上绘制圆
参数2:center。圆心的店,作为一个元组,里面包含2个值
参数3:radius。圆的半径
参数4:color。圆的颜色(BGR颜色)。作为一个元组,里面包含3个值,分别为BGR
参数5:thickness。圆框的厚度
参考代码:
import cv2 as cv
img = cv.imread('lena.jpg') # 路径中不建议包含中文
# 绘制矩形
pt1 = (150, 150)
pt2 = (150+100, 150+100)
color = (0,255,0)
cv.rectangle(img, pt1, pt2, color, thickness=2)
# 绘制圆
center = (200, 200)
radius = 50
color = (0,255,255)
cv.circle(img, center, 50, color, thickness=3)
# 显示图片
cv.imshow('img', img)
cv.waitKey(0)
cv.destroyAllWindows()
效果如下:

4.5 人脸检测
使用 opencv\sources\data\haarcascades\haarcascade_frontalface_default.xml 检测人脸
Xml文件下载方法:https://blog.csdn.net/qq_44611433/article/details/89541648
参考代码:
import cv2 as cv
def face_detect_demo(img):
# 将图片转换为灰度图片
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 加载frontface特征数据
face_detector = cv.CascadeClassifier('haarcascade_frontalface_default.xml')
# 进行人脸检测
faces = face_detector.detectMultiScale(gray)
x, y, w, h = faces[0]
pt1 = (x,y)
pt2 = (x+w, y+h)
color = (0, 255, 0)
cv.rectangle(img, pt1, pt2, color, thickness=2)
cv.imshow('face', img)
img = cv.imread('lena.jpg') # 路径中不建议包含中文
face_detect_demo(img)
cv.waitKey(0)
cv.destroyAllWindows()
效果如下:

4.6 检测多张人脸
参考代码:
import cv2 as cv
def face_detect_demo(img):
# 将图片转换为灰度图片
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 加载frontface特征数据
face_detector = cv.CascadeClassifier('haarcascade_frontalface_default.xml')
# 进行人脸检测
faces = face_detector.detectMultiScale(gray)
print(faces)
# 给人脸绘制矩形框
for face in faces:
x, y, w, h = face
pt1 = (x,y)
pt2 = (x+w, y+h)
color = (0, 255, 0)
cv.rectangle(img, pt1, pt2, color, thickness=2)
cv.imshow('face', img)
img = cv.imread('face.jpg') # 路径中不建议包含中文
face_detect_demo(img)
cv.waitKey(0)
cv.destroyAllWindows()
4.7 检测视频中的人脸
视频由一帧帧的图片组成,要检测视频中的人脸,实际上就是检测每帧图片所对应的人脸
OpenCV中使用 VideoCapture() 加载视频
并通过 read() 方法读取视频中的每一帧图片
返回两个值
flag:是否有下一帧
frame:当前帧
参考代码:(MP4文件需提前拷贝到工程文件夹下)
import cv2 as cv
def face_detect_demo(img):
# 将图片转换为灰度图片
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 加载frontface特征数据
face_detector = cv.CascadeClassifier('haarcascade_frontalface_default.xml')
# 进行人脸检测
faces = face_detector.detectMultiScale(gray)
print(faces)
# 给人脸绘制矩形框
for face in faces:
x, y, w, h = face
pt1 = (x,y)
pt2 = (x+w, y+h)
color = (0, 255, 0)
cv.rectangle(img, pt1, pt2, color, thickness=2)
cv.imshow('face', img)
# 读取视频
cap = cv.VideoCapture('video.mp4')
while True:
# 读取一帧
# 返回值1 flag 如果视频一直在播放 则返回True 否则返回False
# 返回值2 frame 当前帧对应的图片
flag, frame = cap.read()
if not flag:
break
face_detect_demo(frame)
if cv.waitKey(10) == ord('q'):
break
cv.destroyAllWindows()
cap.read()
4.8 拍摄视频
捕获视频的函数VideoCapture()
如果捕获现有的视频文件,则参数是视频文件的路径
如果捕获摄像头的视频,参数就是摄像头的id,一般情况下写0即可
参考代码:(正常情况下会调用笔记本电脑的前置摄像头)
import cv2 as cv
# 读取摄像头视频
def video_demo():
# 捕获摄像头的视频
capture = cv.VideoCapture(0)
id = 0
while True:
# 读取一帧
# 返回值1 flag 如果视频一直在播放 则返回True 否则返回False
# 对于读取摄像头来说 flag的值将一直为True
# 返回值2 frame 当前帧对应的图片
flag, frame = capture.read()
# 对摄像头进行左右反转
frame = cv.flip(frame, 1)
cv.imshow('video', frame)
# 延迟捕获案件退出
c = cv.waitKey(50)
if c == ord('s') or c == ord('S'): # 按s键保存
cv.imwrite('myface%d.jpg' % id, frame)
id += 1
if c == 27: # ESC键
break
video_demo()
更多推荐



所有评论(0)