通过opencv的模块的内置的方法打开电脑摄像头,读取每一帧数据进行分析。通过界面的方式在界面里实时更新摄像头视频并且标记出人脸。
这部分代码可以用来检测opencv的库是否安装正常。是直接调用opencv库里面调用摄像头显示图像的方法,把摄像头得到的每一帧图像直接显示在窗口里,测试代码如下:
#!/usr/bin/python3.7
# coding=utf-8
import cv2#导入opencv模块
#捕捉帧,笔记本摄像头设置为0即可
""" VideoCapture是使用摄像头的方法,
可以有多个摄像头,多以摄像头的编号是从0开始
VideoCapture第一个参数就是摄像头编号"""
capture = cv2.VideoCapture(0)
#循环显示帧
while(True):
"""读取解码摄像头得到的每帧图像,返回值第二个得到的每一帧图像"""
ok, frame = capture.read()
"""显示窗口第一个参数是窗口名,第二个参数是内容"""
cv2.imshow('Carmer', frame)
"""键盘按键等待延时,如果输入按键q,则退出窗口"""
if cv2.waitKey(1) == ord('q'):#按Q退出
break
如果上面的程序可以正常在窗口里显示出来摄像头拍摄的画面,那么说明可以正常使用opencv。
接下里需要去下载和安装人脸识别级联分类器opencv-CascadeClassifier
需要下载分类器:https://gitee.com/tianxiaohuahua/opencv.git
具体教程我参考了这位大神的博客:利用python、tensorflow、opencv实现人脸识别(包会)!
这里需要注意一些问题,比如在填写级联分类器的文件路径名称时候,最好使用局对路径。在使用绝对路径的时候确实麻烦了半个小时找错误。
如果你正确下载了文件,但是报错是
error(-215) !empty() in function detectMultiScale
那么有极大的可能是因为路径的原因才会有错误。需要认真的找到文件路径。
对应文章开头人脸识别以及眼睛识别的具体代码如下:
#!/usr/bin/python3.7
# coding=utf-8
import cv2
"""功能:级联分类器由若干简单分类器和一个神经网络分类器构成。
参数列表:级联分类器文件路径;
其他: 关于opencv-CascadeClassifier(级联分类器)的初步认识 https://blog.csdn.net/sazass/article/details/89150468"""
face_cascade = cv2.CascadeClassifier("/home/tianxiaohua/2PROGRAM/1-python/20.1.30-田小花语音机器人主程序/program/main/opencv/data/haarcascades/haarcascade_frontalface_default.xml") #告诉OpenCV使用人脸识别分类器
eye_cascade = cv2.CascadeClassifier("/home/tianxiaohua/2PROGRAM/1-python/20.1.30-田小花语音机器人主程序/program/main/opencv/data/haarcascades/haarcascade_eye.xml") #告诉OpenCV使用眼睛识别分类器
"""功能:对opencv级联分类器的分类
人脸检测器(默认):haarcascade_frontalface_default.xml
人脸检测器(快速Harr):haarcascade_frontalface_alt2.xml
人脸检测器(侧视):haarcascade_profileface.xml
眼部检测器(左眼):haarcascade_lefteye_2splits.xml
眼部检测器(右眼):haarcascade_righteye_2splits.xml
嘴部检测器:haarcascade_mcs_mouth.xml
鼻子检测器:haarcascade_mcs_nose.xml
身体检测器:haarcascade_fullbody.xml
人脸检测器(快速LBP):lbpcascade_frontalface.xml
原文链接:https://blog.csdn.net/qq_42633819/article/details/81191308 """
""" 功能:cv2.VideoCapture是使用摄像头的方法,
可以有多个摄像头,多以摄像头的编号是从0开始
参数列表: VideoCapture第一个参数就是摄像头编号"""
cap = cv2.VideoCapture(0)
"""功能:进入人脸检测,因为处理的过程是将摄像头得到的每一帧数据进行处理,并且信息实时更新!"""
while True:
"""功能:读取解码摄像头得到的每帧图像,第二个返回值是得到的每一帧图像"""
ok, img = cap.read()
"""功能从:磁盘读取一张图片进行人脸识别标记出来
参数列表: 图片路径
返回值: 读取到的文件缓存
img = cv2.imread(filepath) # 读取图片"""
"""功能:将当前帧转换成灰度图像,输入值是摄像头得到的每一帧图像、代表灰度的参数
灰度图像是为了减少增加识别效率,减少识别的运算量,降低计算复杂度"""
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
"""功能:利用分类器识别出哪个区域为人脸
参数列表:
image:图像缓存文件
scaleFactor图片缩放比例;
minNeighbors要检测的有效点数;
minNeighbors:对特征检测点周边多少有效点同时检测,这样可避免因选取的特征检测点太小而导致遗漏,数字越大识别精度越高;
minSize:特征检测点的最小尺寸。
返回值: 得到一个矩形(一个脸一个)分别是矩形的x, y, w, h(坐标,长宽),
如果是多个脸就有多个矩形,则返回值为列表,列表内包含每一个矩形的信息"""
faces = face_cascade.detectMultiScale(image = gray,
scaleFactor = 1.2,# scaleFactor图片缩放比例
minNeighbors = 4,# minNeighbors要检测的有效点数,数字越大识别精度越高
minSize = (32, 32) )# 特征检测点的最小尺寸
"""功能:将多个脸用框画出来"""
if len(faces) > 0: # 大于0则检测到人脸
for faceRect in faces: # 单独框出每一张人脸,
x, y, w, h = faceRect # 在图像中人脸的位置和大小信息
"""功能:在图像中使用方框标记出来人脸"""
cv2.rectangle(img = img, # 图像文件
pt1 = (x, y), # 方框位置
pt2 = (x + w, y + h), # 方框的大小
color = (255, 0, 0),# 方框的颜色
thickness = 2 ) # 方框的线宽
"""功能:把原来的图像转切割成只剩下人脸的小图像"""
roi_color = img[y:y + h // 2, x:x + w]
"""功能:把原来的灰度图像转切割成只剩下人脸的小灰度图像"""
roi_gray = gray[y:y + h // 2, x:x + w]
"""功能:利用利用分类器识别出哪个区域为眼睛"""
eyes = eye_cascade.detectMultiScale(image = roi_gray, # 图像缓存文件
scaleFactor = 1.1, # scaleFactor图片缩放比例
minNeighbors = 1, # minNeighbors要检测的有效点数
flags = cv2.CASCADE_SCALE_IMAGE, # 层叠缩放图像
minSize = (2, 2)) # 特征检测点的最小尺寸
"""功能:将多个眼睛圈画出来"""
for (ex, ey, ew, eh) in eyes:
cv2.rectangle(img = roi_color, # 图像文件
pt1 = (ex, ey), # 方框位置
pt2 = (ex + ew, ey + eh), # 方框的大小
color = (0, 255, 0), # 方框的颜色
thickness = 2) # 方框的线宽
"""功能:在窗口里输出文字提示"""
cv2.putText(img = img, # 图像文件
text = "face", # 要显示的文字
org = (x, y - 30), # 坐标
fontFace = cv2.FONT_HERSHEY_SIMPLEX, # 字体
fontScale = 1, # 字号
color = (255, 0, 255), # 颜色
lineType = 2) # 字的线宽
"""功能:等待10毫秒看是否有按键输入"""
cv2.imshow(winname = "img", mat = img)
"""功能:如果输入q则退出循环"""
if cv2.waitKey(1) & 0xFF == ord('q'):
break
"""
# 将当前帧保存为图片
ok, frame = cap.read() # 读取一帧数据
img_name = '%s/%s.jpg ' %(path_name, name)
image = frame[y - 10: y + h + 10, x - 10: x + w + 10]
cv2.imwrite(img_name, image)"""
Ubuntu19.0
python3.7
pycharm
本来以为安装opencv的库需要很麻烦,下载了zip还去搜怎么安装,结果安装了半天也没有安装上,但是在pycharm直接搜索这个库就直接安装好了!