人脸检测
做人脸识别,首先要检测出图片/视频中的人脸,这里主要用特征数据HAAR和LBP,我这也是感觉不是很熟练,HAAR和LBP都能实现对人脸特征的提取,一般都在github上下载,但那下载贼慢,我这里会把我用的文件发给大家。
百度网盘:链接:https://pan.baidu.com/s/1mitYMtOlEsXXKYcWDIoZLg
提取码:k9p3
人脸检测不是人脸识别,两者有天差地别的区别,这里说实话我只是调用别人的数据来进行的简单操作而已。
级联分类器
级联分类器,即使用类 Haar 特征工作的级联增强分类器,是集成学习的一种特殊情况,称为 boost。它通常依赖于 Adaboost 分类器(以及其他模型,如 Real Adaboost、Gentle Adaboost 或 Logitboost)。
我们可以看到这里可以对人脸的很多部位做检测,这里我们就搞一个最简单的脸部检测就好了。
识别图片
代码:
import cv2 as cv
def main():
pitcurepath = "C:/Users/POG/Desktop/49d2d78cd115011da7c9b4aa54f5460b.jpg"
global src
src = cv.imread(pitcurepath)
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.namedWindow("results",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
face_detect_demo()
cv.waitKey(0) # 等待
cv.destroyAllWindows() # 销毁窗口
def face_detect_demo():
#把图片变成灰度图片,因为人脸的特征需要在灰度图像中查找
#以下分别是HAAR和LBP特征数据,任意选择一种即可,注意:路径中的‘/’和‘\’是有要求的
# 通过级联检测器 cv.CascadeClassifier,加载特征数据
gray = cv.cvtColor(src,cv.COLOR_BGR2GRAY)
#告诉OpenCV使用人脸识别分类器
face_detector = cv.CascadeClassifier("C:/Users/POG/Desktop/haarshare/haarcascade_frontalface_alt_tree.xml")
#在尺度空间对图片进行人脸检测,第一个参数是哪个图片,第二个参数是向上或向下的尺度变化,是原来尺度的1.02倍,第三个参数是在相邻的几个人脸检测矩形框内出现就认定成人脸,这里是在相邻的5个人脸检测框内出现,如果图片比较模糊的话建议降低一点
faces = face_detector.detectMultiScale(gray,1.02,2)#这里对人脸检测数值进行动态调整
for x,y,w,h in faces:
#rectangle参数说明,要绘制的目标图像,矩形的第一个顶点,矩形对角线上的另一个顶点,线条的颜色,线条的宽度
cv.rectangle(src,(x,y),(x+w,y+h),(0,0,255),2)
cv.imshow("results",src)
if __name__ =="__main__":
main()
结果:
(这里当然是用我最喜欢的霉霉啦!)
识别视频
其实和识别图片差不多的,只是多了一个打开视频而已,因为视频也是一帧一帧当成图片处理的。
import cv2 as cv
def main():
pitcurepath = "C:/Users/POG/Desktop/49d2d78cd115011da7c9b4aa54f5460b.jpg"
global src
#src = cv.imread(pitcurepath)
capture = cv.VideoCapture(0)
#cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.namedWindow("results", cv.WINDOW_AUTOSIZE)
while(True):
ret,frame = capture.read()
frame = cv.flip(frame,1)
face_detect_demo(frame)
c = cv.waitKey(10)
if (c == 27): # esc为27
break
#cv.imshow("input image", image)
#face_detect_demo()
cv.waitKey(0) # 等待
cv.destroyAllWindows() # 销毁窗口
def face_detect_demo(image):
#把图片变成灰度图片,因为人脸的特征需要在灰度图像中查找
#以下分别是HAAR和LBP特征数据,任意选择一种即可,注意:路径中的‘/’和‘\’是有要求的
# 通过级联检测器 cv.CascadeClassifier,加载特征数据
gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
#告诉OpenCV使用人脸识别分类器
face_detector = cv.CascadeClassifier("C:/Users/POG/Desktop/haarshare/haarcascade_frontalface_alt_tree.xml")
#在尺度空间对图片进行人脸检测,第一个参数是哪个图片,第二个参数是向上或向下的尺度变化,是原来尺度的1.02倍,第三个参数是在相邻的几个人脸检测矩形框内出现就认定成人脸,这里是在相邻的5个人脸检测框内出现,如果图片比较模糊的话建议降低一点
faces = face_detector.detectMultiScale(gray,1.02,2)
for x,y,w,h in faces:
#rectangle参数说明,要绘制的目标图像,矩形的第一个顶点,矩形对角线上的另一个顶点,线条的颜色,线条的宽度
cv.rectangle(image,(x,y),(x+w,y+h),(0,0,255),2)
cv.imshow("results",image)
#cv.waitKey(10)
if __name__ =="__main__":
main()
结果:
(这里就献上自己的丑照,大家莫怪。。)
(呜呜为什么我的霉霉检测一会有一会没有,是不是侧着脸所以不太行?)
那今天就先写到这里啦,有时间再学叭。