基于OPENCV的人脸识别学习笔记

两周前收到老师要求参加模式识别比赛,大概内容是检测视频中出现的人脸,然后进行数目统计,一开始看到后毫无头绪的,毕竟这是第一次接触机器视觉类,完全没有方向,后来在同学的见一下开始学习OPENCV,也一直帮我调试程序,在这里也谢谢他了。第一次写也不知道算不算原创,如果有任何违规的地方请告知我,我会更改和删除,谢谢。

开始的学习

大二的时候多少接触过51,32类的单片机,印象最深的便是基于STM32的OPENMV,可及时调用的现成库和机器视觉的第一次惊艳到了我,就先去网上找了CV的入门视频,大概明白了编程环境,语言等。虽然同学安利VSCODE,但最后还是用了Pycharm,语言是Python 3.5。当然在这过程中看了不少CSDN上大佬的文章受益匪浅。

功能代码

借鉴的大佬们的博客:
https://blog.csdn.net/qq_40985985/article/details/108364144
https://blog.csdn.net/sinat_26917383/article/details/70287521
https://blog.csdn.net/haoji007/article/details/106368793/ (原文:https://zhuanlan.zhihu.com/p/80328340)
由于比赛要求特殊(我自己感觉是这样的),没有事先给素材进行模型训练,因此不能跑神经网络等算法,看了上面大佬们的博客,决定采用OPENCV自带的级联器+差值哈希算法来实现,感谢各位前辈们的付出

import cv2


# 差异值哈希算法
def dhash(image):
    # 将图片转化为8*8
    image = cv2.resize(image, (9, 8), interpolation=cv2.INTER_CUBIC)
    # 将图片转化为灰度图
    dhash_str = ''
    for i in range(8):
        for j in range(8):
            if image[i, j] > image[i, j + 1]:
                dhash_str = dhash_str + '1'
            else:
                dhash_str = dhash_str + '0'
    result = ''
    for i in range(0, 64, 4):
        result += ''.join('%x' % int(dhash_str[i: i + 4], 2))
    # print("dhash值",result)
    return result

if __name__ == '__main__':

    faceGascade = cv2.CascadeClassifier("Resources/haarcascade_frontalface_alt2.xml")
    # 调用级联器
    cap = cv2.VideoCapture("Resources/test1.mp4")
    # 捕获视频帧
    # cap = cv2.imread("Resources/1.png")
    list1 = []
    list2 = []
    flag = 1

    while cap.isOpened():
        success, frame = cap.read()
        if not success:
            break
        ImgGray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        # 转换为灰度图像,在这里转换了,因此计算哈希值时的图像转换被我删除了
        ImgGray2 = ImgGray[200:1240, 0:2560]
        # 将图像进行了裁剪,因为素材时一段监控录像,怕上面时间日期等影响效果
        ImgGray2 = cv2.resize(ImgGray2, (0, 0), fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA)
        # 缩小了图像的分辨率来加快识别速度
        faces = faceGascade.detectMultiScale(ImgGray2, 1.2, 10)

        for (x, y, w, h) in faces:
            cv2.rectangle(ImgGray2, (x, y), (x+w, y+h), (255, 0, 0), 2)
            image = (ImgGray2[y:y+h, x:x+w])

            hash2 = dhash(image)

            if flag == 1:
                flag = 0
                list1.append(hash2)
            list1.append(hash2)
            n = 0
            j = 0
            for g in range(len(list1)-1):
            # for hash1 in list1:
                for k in range(len(list1[g])):
                    if (list1[g])[k] == hash2[k]:
                        n = n + 1
                m = n
                n = 0
                # print(m)
                if m > 6:
                    j = j+1
                else:
                    pass
            if j == 0:
                list2.append(hash2)
        # 来查重比较新捕获哈希值是否重复
        print(len(list2))
        # 打印出捕获的哈希值数量,即识别到的人数
        cv2.imshow('video', ImgGray2)
        cv2.waitKey(1)
    cap.release()
    cv2.destroyAllWindows()

在这里插入图片描述

总结

不断捕获人脸的哈希值,然后删除重复的并添加新的,通过改变

faces = faceGascade.detectMultiScale(ImgGray2, 1.2, 10)

1.210两个参数

if m > 6:
                    j = j+1

还有m,哈希值的重复位数来调整检测结果,最终达到一个速度和准确度都满意的值。
由于用于练习的视频是监控录像,截图什么的就不放出了,最后感谢帮我指路和调试程序的同学,也再次感谢各位前辈,前人种树后人乘凉。

猜你喜欢

转载自blog.csdn.net/claymore_2142/article/details/109390903