Notas de estudio de reconocimiento facial basadas en OPENCV

Hace dos semanas, recibí la solicitud de un profesor para participar en un concurso de reconocimiento de patrones. El contenido probablemente sea para detectar las caras que aparecen en el video y luego contar el número. Al principio, no tenía ni idea cuando lo vi. Después de todo, este es mi primer contacto con la visión artificial. No tenía una dirección. Luego, comencé a aprender OPENCV cuando conocí a mis compañeros y me ayudó a depurar el programa todo el tiempo. Gracias aquí. No sé si es un escrito original por primera vez. Si hay alguna infracción, hágamelo saber. Lo cambiaré y eliminaré. Gracias.

Comienza a aprender

En mi segundo año, entré en contacto con 51 y 32 tipos de microcomputadoras de un solo chip. La más impresionante es la OPENMV basada en STM32. La biblioteca lista para usar y la visión artificial que se puede llamar a tiempo me sorprendieron por primera vez, así que busqué en línea la entrada de CV. El video probablemente comprende el entorno de programación, el lenguaje, etc. Aunque fue compañero de clase en Amway VSCODE, al final se usó Pycharm, y el lenguaje fue Python 3.5. Por supuesto, me he beneficiado mucho de leer muchos artículos sobre CSDN.

Código de función

Los blogs de los grandes para aprender:
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 / (Original: https://zhuanlan.zhihu.com/p/80328340)
Debido a los requisitos especiales de la competencia (me siento así), no hay un entrenamiento modelo para los materiales por adelantado, por lo que no puede Ejecute la red neuronal y otros algoritmos, lea los blogs de los grandes mencionados anteriormente y decidió utilizar el algoritmo de hash de diferencia + cascada integrado de OPENCV para lograrlo. Gracias por sus contribuciones

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()

Inserte la descripción de la imagen aquí

para resumir

Siga capturando el valor hash de la cara, luego elimine el duplicado y agregue nuevos, cambiando

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

Dos parámetros en 1.2 y 10

if m > 6:
                    j = j+1

También está m , el número de bits repetidos del valor hash para ajustar el resultado de la detección, y finalmente alcanzar un valor satisfactorio en términos de velocidad y precisión.
Dado que el video utilizado para el ejercicio es un video de vigilancia, no se publicarán capturas de pantalla o similares. Finalmente, agradezco a los compañeros que me ayudaron a guiar y depurar el programa, y ​​agradezco a todos los predecesores que plantaron árboles y descendieron para disfrutar de la sombra.

Supongo que te gusta

Origin blog.csdn.net/claymore_2142/article/details/109390903
Recomendado
Clasificación