前言
本文环境
- python 3.8
- opencv-python 4.6.0.66
包管理器
安装包管理器
代码语言:javascript复制pip install pipenv
pipenv install
添加opencv
代码语言:javascript复制pipenv install opencv-python=4.6.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
查看安装的依赖
代码语言:javascript复制pipenv run pip list
安装所有配置文件中的依赖
代码语言:javascript复制pipenv install
运行
代码语言:javascript复制pipenv run python main.py
人像识别
导入的时候使用
代码语言:javascript复制import cv2
训练库
https://gitee.com/mirrors/opencv/tree/4.x/data/haarcascades
https://github.com/opencv/opencv/tree/master/data/haarcascades
1)对于人脸检测,OpenCV提供以下(从最宽松到最严格):
- haarcascade_frontalface_default.xml
- haarcascade_frontalface_alt.xml
- haarcascade_frontalface_alt2.xml
- haarcascade_frontalface_alt_tree.xml
2) 对于眼睛检测,我们可以选择两种方法:
- haarcascade_eye.xml
- haarcascade_eye_tree_eyegasses.xml
原则
在识别的时候 如果是眼睛检测就最好是在单人并且主体是人像中找。 如果是人脸检测则主体要是人 否则识别效果特别差。
其中尝试了以下几个
haarcascade_frontalface_default.xml haarcascade_frontalface_alt.xml haarcascade_frontalface_alt2.xml haarcascade_frontalface_alt_tree.xml
经测试haarcascade_frontalface_alt2.xml
效果较好。
识别代码
代码语言:javascript复制import cv2
# 读取图片
image = cv2.imread('./imgs/01.png')
# 引入人像识别训练库 haarcascade_frontalface_alt2.xml
face_patterns = cv2.CascadeClassifier(r'.xmlhaarcascade_frontalface_alt2.xml')
# 获取识别到的人脸
faces = face_patterns.detectMultiScale(image, scaleFactor=1.1, minNeighbors=4, minSize=(6, 6))
print(faces)
# 将识别到的人脸框出来
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x w, y h), (0, 255, 0), 2)
# 生成一张新的图片保存识别结果
cv2.imwrite('./imgs/02.jpg', image)
识别前
识别后
OpenCV常用操作
窗口显示图片
代码语言:javascript复制cv2.namedWindow("Image",0);
cv2.resizeWindow("Image", 800, 500);
cv2.imshow("Image", image)
while True:
c = cv2.waitKey(1)
if c == 27:
cv2.destroyAllWindows()
break
其中
代码语言:javascript复制cv2.namedWindow("Image",0);
cv2.resizeWindow("Image", 800, 500);
这两行是设置窗口的大小,默认是图片的实际大小。
后面是让程序死循环,否则会直接推出,这时按Esc
才会推出。
获取摄像头画面
代码语言:javascript复制import cv2
video = cv2.VideoCapture(0)
fps = video.get(cv2.CAP_PROP_FPS)
print(fps)
size = (int(video.get(cv2.CAP_PROP_FRAME_WIDTH)), int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)))
print(size)
while True:
ret, frame = video.read()
cv2.imshow("A video", frame)
c = cv2.waitKey(1)
if c == 27:
break
video.release()
cv2.destroyAllWindows()
摄像头添加人像识别
代码语言:javascript复制import cv2
# 引入人像识别训练库 haarcascade_frontalface_alt2.xml
face_patterns = cv2.CascadeClassifier(r'.xmlhaarcascade_frontalface_alt2.xml')
video = cv2.VideoCapture(0)
fps = video.get(cv2.CAP_PROP_FPS)
print(fps)
size = (int(video.get(cv2.CAP_PROP_FRAME_WIDTH)), int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)))
print(size)
timenum = 0
while True:
ret, frame = video.read()
# 降低解析的频率
if timenum >= 1:
timenum = 0
# 获取识别到的人脸
faces = face_patterns.detectMultiScale(frame, scaleFactor=1.1, minNeighbors=4, minSize=(60, 60))
# 将识别到的人脸框出来
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x w, y h), (0, 255, 0), 2)
cv2.imshow("Face", frame)
c = cv2.waitKey(int(1000 / fps))
timenum = 1
if c == 27:
break
# 解除摄像头占用
video.release()
cv2.destroyAllWindows()