啥都不说一切都在程序里,如果只是复制粘贴的话,修改下所有cv2.CascadeClassifier("D:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt2.xml")的路径
import cv2
import numpy as np
import sys
from PIL import Image
cap = cv2.VideoCapture(1-1)
#脸
classfier = cv2.CascadeClassifier("D:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt2.xml")#去opencv目录找
#classfier = cv2.CascadeClassifier("D:/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml")
#眼睛
eye = cv2.CascadeClassifier('haarcascade_eye.xml')
eye.load('D:/opencv/sources/data/haarcascades/haarcascade_eye.xml')
#耳朵
left_ear = cv2.CascadeClassifier("D:/opencv/sources/data/haarcascades/haarcascade_mcs_leftear.xml")
right_ear = cv2.CascadeClassifier("D:/opencv/sources/data/haarcascades/haarcascade_mcs_rightear.xml")
#鼻子
nose = cv2.CascadeClassifier("D:/opencv/sources/data/haarcascades/haarcascade_mcs_nose.xml")
#嘴巴
mouth = cv2.CascadeClassifier("D:/opencv/sources/data/haarcascades/haarcascade_mcs_mouth.xml")
color = (0, 0, 255)#方框颜色r g b
eye_color = (255,0,0)
left_ear_color = (0,255,0)
right_ear_color = (0,255,0)
nose_color = (100,100,100)
mouth_color = (200,200,0)
#print (color)
if True==cap.isOpened():#true表示正确开始读
print('error')
k=1
else:
k=0
while(k):
ret,frame = cap.read()
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
gray1 = cv2.cvtColor(frame,cv2.COLOR_BGR2BGRA)
font=cv2.FONT_HERSHEY_SIMPLEX#字体设置
faceRects = classfier.detectMultiScale(gray, scaleFactor = 1.2, minNeighbors =3 , minSize = (12, 12))
eyes = eye.detectMultiScale(gray, scaleFactor = 1.2, minNeighbors =6 , minSize = (5, 5))
left_ears = classfier.detectMultiScale(gray, scaleFactor = 1.2, minNeighbors =6 , minSize = (5, 5))
right_ears = classfier.detectMultiScale(gray, scaleFactor = 1.2, minNeighbors =6 , minSize = (5, 5))
noses = classfier.detectMultiScale(gray, scaleFactor = 1.2, minNeighbors =3 , minSize = (5, 5))
#
mouthes = classfier.detectMultiScale(gray, scaleFactor = 1.2, minNeighbors =2 , minSize = (12, 12))
#其中classfier.detectMultiScale()即是完成实际人脸识别工作的函数,该函数参数说明如下:
#gray:要识别的图像数据(即使不转换成灰度也能识别,但是灰度图可以降低计算强度,因为检测的依据是哈尔特征,转换后每个点的RGB数据变成了一维的灰度,这样计算强度就减少很多)
#scaleFactor:图像缩放比例,可以理解为同一个物体与相机距离不同,其大小亦不同,必须将其缩放到一定大小才方便识别,该参数指定每次缩放的比例
#minNeighbors:对特征检测点周边多少有效点同时检测,这样可避免因选取的特征检测点太小而导致遗漏
#minSize:特征检测点的最小值
cv2.rectangle(gray, (000, 000), (300, 300), eye_color, 2)
for eye1 in eyes:
eye_x , eye_y, eye_w, eye_h = eye1
# cv2.rectangle(gray1, (eye_x, eye_y), (eye_x + eye_w-10, eye_y + eye_h-10), eye_color, 2)
# cv2.putText(gray1,'excited',(eye_x , eye_y-5), font, 1,color,1)#1是字体大小
cv2.circle(gray1,(eye_x+20 , eye_y+20 ), 15 , eye_color, 2)
for left_ear1 in left_ears:
left_ear_x , left_ear_y, left_ear_w, left_ear_h = left_ear1
cv2.rectangle(gray1, (left_ear_x, left_ear_y), (left_ear_x + left_ear_w-10, left_ear_y + left_ear_h-10), left_ear_color, 2)
for right_ear1 in right_ears:
right_ear_x , right_ear_y, right_ear_w, right_ear_h = right_ear1
cv2.rectangle(gray1, (right_ear_x, right_ear_y), (right_ear_x + right_ear_w-10, right_ear_y + right_ear_h-10), right_ear_color, 2)
for nose1 in noses:
noses_x , noses_y, noses_w, noses_h = nose1
cv2.rectangle(gray1, (noses_x, noses_y), (noses_x + noses_w-10, noses_y + noses_h-10), nose_color, 2)
for mouth1 in mouthes:
mouth_x , mouth_y, mouth_w, mouth_h = mouth1
cv2.rectangle(gray1, (mouth_x, mouth_y), (mouth_x + mouth_w-10, mouth_y + mouth_h-10), mouth_color, 2)
for faceRect in faceRects: #单独框出每一张人脸
x, y, w, h = faceRect
# cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 2)
cv2.rectangle(gray1, (x, y), (x + w-10, y + h-10), color, 2)
cv2.putText(gray1,'excited',(x,y-20), font, 1,color,2)#1是字体大小
# print('行列=')
# print(gray.shape)
# print('数据类型=')
# print(gray.dtype)#数据类型uint8
cv2.imshow('1channe_video',gray)
cv2.imshow('3channe_video',gray1)
if cv2.waitKey(1) & 0xFF == ord('q'):
cap.release()
cv2.destroyWindow('1channe_video')
cv2.destroyWindow('3channe_video')
elif cv2.waitKey(1) &0xff == ord('w'):
cv2.imwrite('截图.png',gray1)
cv2.destroyAllWindows() indows()