第一篇博客 openCV 人脸检测

1 篇文章 0 订阅
1 篇文章 0 订阅



啥都不说一切都在程序里,如果只是复制粘贴的话,修改下所有cv2.CascadeClassifier("D:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt2.xml")的路径




#-*- coding: utf-8 -*-


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()      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值