opencv-python 人脸识别检测+人脸马赛克

模型文件

人脸检测模型文件

进入网址后点击下载即可

本文所使用的函数

cv2.rectangle()

在图像上绘制一个简单的矩形

参数:

  • img:要划的线所在的图像;

  • pt1: 左上顶点

  • pt2: 右下顶点

  • color:边框的颜色

  • thickness=1:线条粗细,默认是1.如果一个闭合图形设置为-1,那么整个图形就会被填充。

  • line_type:int类型的line_type,绘制线的类型,-1就是FILLED(填满),4是LINE_4(4连通域),8是LINE_8(8连通域),LINE_AA(抗锯齿线)。

  • shift:int类型的shift,该数值可以控制箭头的长度和位置,比如当其为1时,箭头的位置变为原先的1/2,长度也变为1/2,若该数值为2,则均变为原先的1/4。我猜测数值X和缩放的比例关系应该是2的X次方的倒数。

原图:

opencv-python 人脸识别检测+人脸马赛克_第1张图片

 

人脸检测

import cv2 as cv
import numpy as np

if __name__ == '__main__':
    img = cv.imread('image/img_14.png')
    
    # 读取模型文件
    face = cv.CascadeClassifier('./data/haarcascade_frontalface_alt.xml')
    """
    参数1:image–待检测图片,一般为灰度图像加快检测速度;
    参数2:objects–被检测物体的矩形框向量组;
    参数3:scaleFactor–表示在前后两次相继的扫描中,搜索窗口的比例系数。(默认为1.1)即每次搜索窗口依次扩大10%,该值越大计算的越快,人脸检测也越差;
    参数4:minNeighbors–表示构成检测目标的相邻矩形的最小个数(默认为3个)。
    """
    faces= face.detectMultiScale(img,scaleFactor=1.2,minNeighbors=2)
    print(faces)
    # 进行人脸画框
    for x,y,w,h in faces:
        cv.rectangle(img,(x,y),(x+w,y+h),[0,0,255],2)
    cv.imshow('img', img)
    cv.waitKey(0)
    cv.destroyAllWindows()

效果图展示:

opencv-python 人脸识别检测+人脸马赛克_第2张图片

 

 人脸已经识别出来了对不对,接下来就是在识别人脸的基础上,附上马赛克

 人脸马赛克

结合上面的人脸检测,制作人脸马赛克

import cv2 as cv
import numpy as np

if __name__ == '__main__':
    img = cv.imread('image/img_14.png')

    # 读取模型文件
    face = cv.CascadeClassifier('./data/haarcascade_frontalface_alt.xml')
    """
    参数1:image–待检测图片,一般为灰度图像加快检测速度;
    参数2:objects–被检测物体的矩形框向量组;
    参数3:scaleFactor–表示在前后两次相继的扫描中,搜索窗口的比例系数。(默认为1.1)即每次搜索窗口依次扩大10%,该值越大计算的越快,人脸检测也越差;
    参数4:minNeighbors–表示构成检测目标的相邻矩形的最小个数(默认为3个)。
    """
    # 执行模型,左上顶点(x,y)和w(宽),h(高)
    faces= face.detectMultiScale(img,scaleFactor=1.2,minNeighbors=2)
    print(faces)
    """ 
    [[290  17  70  70]
     [566  67  59  59]
     [ 35  77  62  62]
     [440  61  75  75]
     [129  60  60  60]]
    """
    # 进行人脸画框
    for x,y,w,h in faces:
        # 获取人脸的位置
        frameBox = img[y:y + h, x:x + w]
        # 缩小十倍
        frameBox = frameBox[::10, ::10]
        # x轴和y轴同时拉伸10倍,回复原来的大小
        frameBox = np.repeat(frameBox, 10, axis=0)
        frameBox = np.repeat(frameBox, 10, axis=1)
        # 获得原脸框的宽高
        a, b = img[y:y + h, x:x + w].shape[:2]
        # 让马赛克的宽高与原脸宽的宽高一样,不让会报错
        img[y:y + h, x:x + w] = frameBox[:a, :b]
        # 绘制脸宽矩形
        # cv.rectangle(img,(x,y),(x+w,y+h),[0,0,255],2)
    cv.imshow('img', img)
    cv.waitKey(0)
    cv.destroyAllWindows()

效果图展示:

opencv-python 人脸识别检测+人脸马赛克_第3张图片

 

 图片马赛克我们会了,那如果是动态的视频呢,又该怎么打马赛克呢?

摄像头给自己打马赛克

cv2.VideoCapture()类

VideoCapture()是用于从视频文件、图片序列、摄像头捕获视频的类;

VideoCapture()中参数是0,表示打开笔记本的内置摄像头,参数是视频文件路径则打开视频 ,

(1)ret,frame = cap.read()

  • cap.read()按帧读取视频,ret,frame是获cap.read()方法的两个返回值。其中ret是布尔值,如果读取帧是正确的则返回True,如果文件读取到结尾,它的返回值就为False。frame就是每一帧的图像,是个三维矩阵。

(2)cap.isOpened()

  • 摄像头初始化,返回true则成功

import cv2 as cv
import numpy as np

if __name__ == '__main__':
    # 实例化控制摄像头的类
    cap = cv.VideoCapture(0)
    # cap = cv.VideoCapture("视频文件路径")
    # cap.isOpened() 摄像头初始化,返回true则成功
    while cap.isOpened():
        # 读取一帧图像,ret :是否读取正确 , frame : 读取的图像
        ret,frame = cap.read()
        # 加载模型文件
        face = cv.CascadeClassifier('./data/haarcascade_frontalface_alt.xml')
        # 执行模型,左上顶点(x,y)和w(宽),h(高)
        faces = face.detectMultiScale(frame,scaleFactor=1.1,minNeighbors=4)
        # 循环遍历识别到的每一张人脸数据
        for x, y, w, h in faces:
            # 在人脸上加马赛克
            frameBox = frame[y:y+h,x:x+w]
            frameBox = frameBox[::10,::10]
            frameBox = np.repeat(frameBox,10,axis=0)
            frameBox = np.repeat(frameBox, 10, axis=1)
            a,b = frame[y:y + h, x:x + w].shape[:2]
            frame[y:y + h, x:x + w] = frameBox[:a,:b]
            # 在人脸周围画框
            cv.rectangle(frame, (x, y), (x + w, y + h), [0, 0, 255], 2)
        # 展示照片
        cv.imshow('frame', frame)
        # 1ms 读取一帧
        k = cv.waitKey(1)
        print(k)
        # 按“q”退出
        if k == ord('q'):
            break

    cv.destroyAllWindows()

效果图展示:

没有效果图!!!!!

还是蛮好玩的,大家也可以试一下!!!

你可能感兴趣的:(opencv,计算机视觉,opencv,python,计算机视觉,深度学习,视觉检测)