OpenCV调用摄像头 , 人脸检测demo

github博客传送门
csdn博客传送门

环境:

安装OpenCV:
conda install opencv 或
pip install opencv
安装PIL:
conda install pillow
pip install pillow

效果:

效果图

所需文件:

所需文件
下载链接: 所需文件下载链接
本来是想不收积分的 , 不知道为什么不能选择 0 积分了. 特此我将xml文件的内容贴在本文的最下方 .

代码

import cv2
import numpy as np

cv2.namedWindow("test")  # 打卡一个窗口 标题为 test
cap = cv2.VideoCapture(0)  # 打开笔记本的内置摄像头,0为计算机默认的摄像头
# cap = cv2.VideoCapture("test.mp4")  #导入视频文件进行检测
success, frame = cap.read()  # 返回true/Flase,和当前截取的这一帧的图片,三维矩阵,(成功截取返回ture)

classifier = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")  # 产生一个检测器,检测的依据全都储存在参数所代表的那个xml文件中

while success:
    success, frame = cap.read()  # 再次读取视频文件
    size = frame.shape[:2]  # 图片是三维矩阵,要获取图片的长和宽,必须的知道图片的shape,一张图片的shape为[H,W,C],取前两个即得到图片的宽高
    image = np.zeros(size, dtype=np.float16)  # 生成了一个 类型为 float16的 0 矩阵
    image = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # 对读取出来的图片进行颜色空间转换,转换成灰度图
    cv2.equalizeHist(image, image)  # 灰度图片直方图均衡化(只接受灰度图)
    divisor = 8  # 限制得到目标区域大小和原始图片大小的比例,即最小的检测框为整张图片的八分之一大
    h, w = size  # 获取每一帧图片的高/宽
    minSize = (w // divisor, h // divisor)  # 最小的检测框为整张图片的八分之一大
    faceRects = classifier.detectMultiScale(image, 1.2, 2, cv2.CASCADE_SCALE_IMAGE, minSize)

    # 这是一个人脸检测的函数,image为待检测图片,一般为灰度图像加快检测速度,1.2表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%.
    # 2表示构成检测目标的相邻矩形的最小个数(默认为3个)。。 这些都是官方给出的。这些参数自己调整以达到自己想要的效果
    # 返回值为框住的人脸的坐标(左上角X坐标,左上角Y坐标,框的宽,高)
    if len(faceRects) > 0:
        for faceRect in faceRects:  # 遍历所得的所有人脸的坐标
            x, y, w, h = faceRect  # 返回左上角X坐标,左上角Y坐标,框的宽,高
            cv2.rectangle(frame, (x, y), (x + h, y + w), (0, 255, 0), 2)  # 在未做灰度处理前的图片上画矩形框,frame为图片,(x, y)为左上角X,Y坐标,
            # (x + h, y + w)为右下角XY坐标,(0, 255, 0)表示红色,2表示画矩形的线宽为2

            # # 这里的眼睛嘴巴的坐标是根据人脸框来确定的,所以这里算了下眼睛和嘴巴的大致位子。位置的计算方式不必过分深究。
            # cv2.circle(frame, (x + w // 4, y + h // 4 + 30), min(w // 8, h // 8), (255, 0, 0))  # 左眼  参数1为图片,参数2为圆圈中心点坐标,参数3为半径,参数4为颜色
            # cv2.circle(frame, (x + 3 * w // 4, y + h // 4 + 30), min(w // 8, h // 8), (255, 0, 0))  # 右眼     同上
            # cv2.rectangle(frame, (x + 3 * w // 8, y + 3 * h // 4), (x + 5 * w // 8, y + 7 * h // 8), (255, 0, 0))  # 嘴巴 参数1图片,参数2左上角坐标,参数3右下脚坐标,参数4颜色
    cv2.imshow("test", frame)  # 把每一帧的图show 出来
    key = cv2.waitKey(10)  # 不断刷新图像,10ms刷新一下,返回一个数字,数字代表的意思不知道
    c = chr(key & 255)  # 把数字转换成字符串
    if c in ['q', 'Q', chr(27)]:  # 如果C在这个列表的三个中就break
        break
cv2.destroyWindow('test')  # 关闭所有窗口

xml文件名: haarcascade_frontalface_default.xml

xml文件内容:

发不了这么长的文章 大家去我的csdn下载吧.

posted @ 2018-12-22 12:25  账号  阅读(488)  评论(0编辑  收藏  举报