NO.4 机器视觉 人脸识别&色彩过滤

零蚀
[🔗 opencv-python的官方文档]


简介

  • 人脸识别的原理
    • 这里用到的人脸识别的方式,也是通过级联分类器的方式,像安卓中我们用到的文件都是haar开头的,这个文件就是以haar特征为特征计算方式之一来进行计算的(一般还会用到Adaboost),它是用白色像素之和减去黑色像素的特征之和最后得出Haar特征值。

    • 我们在用级联分类器的时候,我们会用到训练数据(.xml),我们这个训练数据(机器学习),在计算图像区域内是否有人脸,他会拿着一个数据模版,按照haar等特征计算方式,来计算是否是人脸,这个模版计算的方式类似卷积方式。(Haar白色区域减黑色区域的模版有以下3种)。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fHYyNJIV-1601724886237)(media/16016334531257/16016353179272.jpg)]

    • 详情可见opencv的python官方文档🔜 🔗 opencv-python的官方文档 (人脸检测相关的在“物体检测”一栏中),关于如何制作数据,后面的机器学习单元时候会详细来说,如何通过机器学习来获得人脸训练数据。(官方文档可右键转中文)

  • 实现人脸识别
    import cv2 as cv
    
    src = cv.imread("../source/jyz.jpeg")
    
    # 导入训练数据
    classifier = cv.CascadeClassifier("../source/haarcascade_frontalface_default.xml")
    
    # 1 源数据, 2 缩放系数 ,3最小检测次数(领域检测数据)
    faces = classifier.detectMultiScale(src, 1.3, 5)
    
    print("检测到人脸的数量:", len(faces))
    
    for face in faces:
        x = face[0]
        y = face[1]
        width = face[2]
        height = face[3]
        # 绘制蓝色的脸部区域矩形 (源数据;起点坐标;终点坐标;色值;边框宽度)
        cv.rectangle(src, (x, y), (x + width, y + height), (255, 0, 0), 4)
        cv.putText(src, "JinYuZhen", (x, y-10), cv.FONT_HERSHEY_COMPLEX, 1, (255, 0, 200), 2)
    
    cv.imshow("src", src)
    cv.waitKey()
    

    在这里插入图片描述

    • 眼睛识别和脸部识别的大体逻辑也是一样的,除了这种方式,我们也可以在识别的脸部进行脸部识别。
    for face in faces:
    x = face[0]
    y = face[1]
    width = face[2]
    height = face[3]
    # 绘制蓝色的脸部区域矩形 (源数据;起点坐标;终点坐标;色值;边框宽度)
    cv.rectangle(src, (x, y), (x + width, y + height), (255, 0, 0), 4)
    cv.putText(src, "JinYuZhen", (x, y - 10), cv.FONT_HERSHEY_COMPLEX, 1, (255, 0, 200), 2)
    
    # 截取脸部图片ROI
    face_src = src[y:y + height, x:x + width]
    eyes = eyes_detect.detectMultiScale(face_src, 1.1, 5)
    
    # 获取眼睛的区域
    for eye in eyes:
        eye_x = eye[0]
        eye_y = eye[1]
        eye_w = eye[2]
        eye_h = eye[3]
        cv.rectangle(src, (eye_x+x, eye_y+y), (eye_x + eye_w+x, eye_y + eye_h+y), (0, 255, 0), 4)
    

    在这里插入图片描述

    • 相机代码结合
    # 获取摄像头数据
    camera = cv.VideoCapture(0)
    width = camera.get(cv.CAP_PROP_FRAME_WIDTH)
    height = camera.get(cv.CAP_PROP_FRAME_HEIGHT)
    fps = camera.get(cv.CAP_PROP_FPS)
    
    # 物体识别
    faces = cv.CascadeClassifier("../source/haarcascade_frontalface_default.xml")
    
    
    while True:
        flag, frame = camera.read()
        if flag:
            src = cv.flip(frame, 1)
            face = faces.detectMultiScale(src, 1.1, 5)
            for face_array in face:
                f_x = face_array[0]
                f_y = face_array[1]
                f_w = face_array[2]
                f_h = face_array[3]
    
                # 生成变化矩阵
                cv.rectangle(src, (f_x, f_y), (f_x + f_w, f_y + f_h), (0, 255, 0), 4)
                cv.imshow("camera", src)
    
        key = cv.waitKey(int(1000 / fps))
    

过滤

  • HSV 颜色模型

    在这里插入图片描述

    • HSV(Hua色调,Saturation饱和度,Value亮度),用角度来对应每一个RGB色值。他的用处比如计算整个图片的亮度值等等:
    import cv2 as cv
    import numpy as np
    
    src = cv.imread("../source/hang.jpeg")
    
    dst = cv.cvtColor(src, cv.COLOR_BGR2HSV)
    
    # 计算当前的图片的平均亮度
    average = np.sum(cv.split(dst)[2]) / (src.shape[0] * src.shape[1])
    
    print(average)
    
    • 以下案例是通过定义色调范围来取出图片的部分内容

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H2RZQYwF-1601724886242)(media/16016334531257/16017197175171.jpg)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kevcWobd-1601724886243)(media/16016334531257/16017199180773.jpg)]

    • 按照上述的色调来设置过滤出自己需要的颜色,比如这里我获取图片中所有的绿色部分。
    import cv2 as cv
    
    src = cv.imread("../source/android.png")
    hsv = cv.cvtColor(src, cv.COLOR_BGR2HSV)
    
    # 定义上下限(获取所有绿色部分)
    down_line = (26, 43, 46)
    up_line = (77, 255, 255)
    
    # 筛选需要的数据
    dst = cv.inRange(hsv, down_line, up_line)
    
    cv.imshow("src", src)
    cv.imshow("dst", dst)
    cv.waitKey()
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lhzxJaSs-1601724886243)(media/16016334531257/16017216526869.jpg)]

    • 我们可以针对这种结果今年那行抠图(颜色命中区域为白色,未命中区域为黑色)。
    h = src.shape[0]
    w = src.shape[1]
    
    for i in range(h):
        for j in range(w):
            color = src2[i, j]
            if color == 0:
                # 将源数据非绿色区域全部设置为白色
                src[i, j] = 255
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DdqsZANO-1601724886244)(media/16016334531257/16017228895218.jpg)]

    • 将遍历的代码简化
    # for i in range(h):
    #     for j in range(w):
    #         color = src2[i, j]
    #         if color == 0:
    #             # 将源数据非绿色区域全部设置为白色
    #             src[i, j] = 255
    
    # 简化 上面内容,将src2中的内容如果为0,src对应的区块改为白色
    src[src2 == 0] = (255, 255, 255)
    

🔗 前言
🔗 机器人视觉篇
🔗 NO.1 机器视觉 前言
🔗 NO.2 机器视觉 几何变化 & 特效处理
🔗 NO.3 机器视觉 直方图 & 帧提取
🔗 NO.5 机器人视觉 二值化 & 卷积
🔗 NO.6 机器人视觉 霍夫检测 & 边缘查找
🔗 NO.7 C++中使用Opencv
🔗 NO.8 C++ 直方图 & 卷积
🔗 NO.9 C++ 匹配 & 变化
🔗 NO.10 C++ 图像算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

零蚀zero eclipse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值