opencv-检测人脸区域

人脸检测

import numpy as np
import cv2

img=cv2.imread('./zhou.jpg') #图片里面可以有多人进行识别
img.shape #(325,500,3)

#级联分类器(多个小的分类器合到一起工作,级联) 不同小分类器识别眼睛 鼻子 耳朵 嘴 合到一起就是人脸
#haar特征数据:嘴唇 嘴唇上的颜色深度 比周边深
#算法级联分类器,根据haar特征进行检测 符合特征 识别出来
face_detector=cv2.CascadeClassifier('./haarcascade_frontalface_default.xml')
#将site-packages/cv2/data的一个haarcascade_frontalface_default.xml放到文件下
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
face_zones=face_detector.detectMultiScale(gray) #检测多重缩放 
#返回的数据是目标区域坐上角的坐标,与目标区域宽度和高度,正方形区域 array([[183,51,188,188]],dtype=int32)
for x,y,w,h in face_zones:
	#cv2.rectangle(img,pt1=(x,y),pt2=(x+w,y+h),color=[0,0,255],thickness=2) #矩形
	cv2.circle(img,center=(x+w//2,y+h//2),radius=w//2,color=[0,0,255],thickness=2)
cv2.imshow('face',img) #线的厚度
cv2.waitKey(0)
cv2.destroyALLWindows()

参数调整

face_zones=face_detector.detectMultiScale(gray,scaleFactor=1.01,minNeighbors=20,minSize=(20,20),maxSize=(28,28)) #有参数scaleFactor缩放参数 是一个大于1的数 计算机进行识别也是一个一个框进行扫描 从小框按比例变大框 比例太大就会漏掉 scaleFactor调整为1.5识别的人脸就会变少很多 另一个参数minSize

cv2.resize(img,(1063,552))
#也可以使用绝对路径进行使用 haarcascade文件也可以换成alt等其他
face_detector=cv2.CascadeClassifier('D:\Python3.6.8\......\haarcascade_frontalface_alt.xml')

视频中的人脸检测

import numpy as np
import cv2

#创建一个窗口叫dzd
win = cv2.namedWindow('dzd',cv2.WINDOW_NORMAL) #窗口大小可以改变
#AUTOSIZE窗口大小不可改变 FREERATIO自适应比例 FULLSCREEN全屏,不可变
cv2.resizeWindow('dzd',640,200) #窗口调整
rose = cv2.imread('./rose.jpg')
cv2.imshow('dzd',rose)
cv2.waitKey(0)
cv2.destroyWindow('dzd')

v = cv2.VideoCapture(0) #'./dzd2.mp4'这就可以识别视频中的 改为0则调用摄像头
face_detector = cv2.CascadeClassifier('./haarcascade_frontalface_alt2.xml')
# 视频是由一张张图片组成,每一张图片,帧
while True:
    flag,frame = v.read()
    if not flag: #return 'false' if no frames has been grabbed
        break
#     frame = cv2.resize(frame,(640,360)) #调整窗口
    gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) #转为黑白
    face_zones = face_detector.detectMultiScale(gray,scaleFactor = 1.1,
                                                minNeighbors = 3)
    for x,y,w,h in face_zones:
        cv2.rectangle(frame,pt1 = (x,y),pt2 = (x+w,y+h),color = [0,0,255],thickness=2)
    cv2.imshow('dzd',frame)
    key = cv2.waitKey(1)
    if key == ord('q'): #将q转化为ascall码
        break
v.release() #释放视频流
cv2.destroyAllWindows()

人脸采集

import numpy as np
import cv2

v = cv2.VideoCapture(0) #打开摄像头
#加载人脸识别
face_detector = cv2.CascadeClassifier('./haarcascade_frontalface_alt2.xml')
# 视频是由一张张图片组成,每一张图片,帧
num = 1
while True:
    flag,frame = v.read()
    if not flag:
        break
    gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    face_zones = face_detector.detectMultiScale(gray,scaleFactor = 1.1,
                                                minNeighbors = 3)
    for x,y,w,h in face_zones[:1]:
        cv2.rectangle(frame,pt1 = (x,y),pt2 = (x+w,y+h),color = [0,0,255],thickness=2)
    cv2.imshow('dzd',frame)
    key = cv2.waitKey(41)
    if key == ord('Y'):
        if len(face_zones) > 0:
            face = frame[y+2:y+h-1,x+2:x+w-1] #去掉红线
            face = cv2.resize(face,(64,64))
            cv2.imwrite('./faces/lufengkun/%d.jpg'%(num),face)
            num +=1
        if num == 11:
            break
    elif key == ord('q'):
        break
v.release()#释放视频流
cv2.destroyAllWindows()

f = cv2.imread('./faces/lufengkun/1.jpg')
f = cv2.equalizeHist(f[:,:,0])
cv2.imshow('f',f)
cv2.waitKey(0)
cv2.destroyAllWindows()

你可能感兴趣的:(opencv,人脸识别,opencv,计算机视觉,python)