python学习笔记——opencv人脸识别,打卡机器


import dlib
import face_recognition
import numpy as np
import cv2
##加载图片
imgElon = face_recognition.load_image_file('ImagesBasic/elon-musk-4.jpg')
##将图片转换成RGB格式
imgElon = cv2.cvtColor(imgElon,cv2.COLOR_BGR2RGB)
##加载图片
imgTest = face_recognition.load_image_file('ImagesBasic/elon test.jpg')
##将图片转换成RGB格式
imgTest = cv2.cvtColor(imgTest,cv2.COLOR_BGR2RGB)
##检测到脸部,它返回一个由四元组组成的列表,每个四元组表示一个人脸的位置,分别对应于人脸框的左上角和右下角的坐标。
# 具体来说,四元组的四个元素分别是:(top, right, bottom, left)
faceLoc = face_recognition.face_locations(imgElon)[0]
#对面部信息进行编码,用于将人脸图像编码为一个128维的向量。这个向量可以用于比较两张人脸图像的相似度,从而实现人脸识别等功能。
encodeElon = face_recognition.face_encodings(imgElon)[0]

#print(faceLoc)
#第一个值为面对的位置,第二个点为两点的面部位置
cv2.rectangle(imgElon,(faceLoc[3],faceLoc[0]),(faceLoc[1],faceLoc[2]),(255,0,255),2)

faceLocTest = face_recognition.face_locations(imgTest)[0]
#对面部信息进行编码
encodeTest = face_recognition.face_encodings(imgTest)[0]
#print(faceLoc)
#第一个值为面对的位置,第二个点为两点的面部位置
#cv2.rectangle(image, start_point, end_point, color, thickness)

# 其中,image是要绘制矩形的图像,start_point是矩形的左上角坐标,end_point是矩形的右下角坐标,color是矩形的颜色,thickness是矩形边框的粗细。
cv2.rectangle(imgTest,(faceLocTest[3],faceLocTest[0]),(faceLocTest[1],faceLocTest[2]),(255,0,255),2)
#编码训练集和测试集
results = face_recognition.compare_faces([encodeElon],encodeTest)

#人脸距离,距离越短,匹配越好
faceDis = face_recognition.face_distance([encodeElon],encodeTest)
print(results,faceDis)
#在图片上打印结果
cv2.putText(imgTest,f'{results} {round(faceDis[0],2)}',(50,50),cv2.FONT_HERSHEY_COMPLEX,1,(0,0,255),2)

##命名
cv2.imshow('Elon Musk',imgElon)
cv2.imshow('Elon Test',imgTest)
##设置延迟
cv2.waitKey(0)

这段代码来自于B站的openCV项目实战视频合集,跟着视频敲了一遍代码,并对语句进行了注释,仅用于学习笔记的记录。

描述:利用openCV框架,比对图片库里的图片。调用摄像头,比对图片库里的图片,并在Excel中记录出现的时间,实现刷脸打卡的功能。

import dlib
import face_recognition
import numpy as np
import cv2
import os
from datetime import datetime
##创建一个列表,自动读取数据,并编号
path = 'ImagesBasic'
path_file = 'Attendence.csv'
os.chmod(path_file,0o755)
images = []
classNames = []
myList = os.listdir(path)
print(myList)
##导入图片并使用这些图片的名称
for cl in myList:
    ##cv2.imread()接口读图像,读进来直接是BGR 格式数据格式在 0~255
    curImg = cv2.imread(f'{path}/{cl}')
    ##append函数可以向列表末尾添加元素
    images.append(curImg)
    classNames.append(os.path.splitext(cl)[0])
print(classNames)
##对每一张图片进行编码

def findEncodings(images):
    encedeList= []
    for img in images:
        #2、cv2.cvtColor(p1,p2) 是颜色空间转换函数,p1是需要转换的图片,p2是转换成何种格式。
    # cv2.COLOR_BGR2RGB 将BGR格式转换成RGB格式
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        '''face_recognition.face_encodings是Python中的一个人脸识别库,它可以用于将人脸图像编码为128维向量。
        这个库使用深度学习模型来识别人脸,并且可以在不同的图像中识别同一个人的面部特征。
        face_recognition.face_encodings函数接受一个图像作为输入,并返回一个包含一个或多个人脸编码的列表。
        每个编码都是一个长度为128的向量,可以用于比较两个人脸是否相似。
        '''
        encede = face_recognition.face_encodings(img)[0]
        encedeList.append(encede)
    return encedeList

def marakAttendance(name):
    # with open 是 Python 中用于打开文件的一种语法结构,它可以自动管理文件的打开和关闭,避免了手动打开和关闭文件时可能出现的错误。
    #r是以只读模式打开文件
    #r+是以读写的方式打开文件
    with open('Attendence.csv','r+') as f:
        myDataList = f.readlines()
        # print(myDataList)
        #一张一张列出图片
        nameList=[]
        for line in myDataList:
            entry = line.split(',')
            '''
            line.split() 是 Python 中字符串对象的一个方法,
            它可以将一个字符串按照指定的分隔符进行分割,并返回一个由分割后的子字符串组成的列表。
            默认情况下,分隔符是空格符,但是也可以通过传递参数来指定其他的分隔符。
            '''
            nameList.append(entry[0])
        if name not in nameList:
            now = datetime.now()
            '''
            now.strftime() 是 Python 中 datetime 模块中的一个方法,
            用于将日期时间对象格式化为字符串。它接受一个格式化字符串作为参数,该字符串包含特定的格式代码,
            用于指定日期时间对象的输出格式。例如,“%Y-%m-%d %H:%M:%S” 表示年-月-日 时:分:秒的格式。
            '''
            dtString = now.strftime('%H:%M:%S')
            f.writelines(f'\n{name}.{dtString}')

#查找和编码图像
encodeListKnown = findEncodings(images)
print(len(encodeListKnown))
print('Encoding complete')
##从初始化摄像头中捕获一张图片
cap = cv2.VideoCapture(0)
#编写循环,逐贞筛选图片
while True:
    sucess, img =cap.read()
    imgS= cv2.resize(img,(0,0),None,0.25,0.25)
    facesCurFrame = face_recognition.face_locations(imgS)
    ##发送人脸的位置
    encodeCurFrame = face_recognition.face_encodings(imgS,facesCurFrame)
    #将摄像头里的图像与学习的图片进行比较
    #使用zip是将所有的图片在同一个循环中进行
    for encodeFace, faceLoc in zip(encodeCurFrame,facesCurFrame):
        matches = face_recognition.compare_faces(encodeListKnown,encodeFace)
        faceDis = face_recognition.face_distance(encodeListKnown,encodeFace)
        print(faceDis)
        ##距离值越小,相似性越高。
        matchIndex = np.argmin(faceDis)

        if matches[matchIndex]:
            name = classNames[matchIndex].upper()
            print(name)
            y1, x2, y2, x1=faceLoc
            y1,x2,y2,x1 = y1*4,x2*4,y2*4,x1*4
            # 其中,image是要绘制矩形的图像,
            # start_point是矩形的左上角坐标,end_point是矩形的右下角坐标,color是矩形的颜色,thickness是矩形边框的粗细。
            cv2.rectangle(img,(x1,y1),(x2,y2),(0,255.2),2)
            cv2.rectangle(img,(x1,y2-35),(x2,y2),(0,255,0),cv2.FILLED)
            cv2.putText(img,name,(x1+6,y2-6),cv2.FONT_HERSHEY_COMPLEX,1,(255,255,255),2)
            marakAttendance(name)


    cv2.imshow('webcam',img)
    cv2.waitKey(1)






# ##加载图片
# imgElon = face_recognition.load_image_file('ImagesBasic/elon-musk-4.jpg')
# ##将图片转换成RGB格式
# imgElon = cv2.cvtColor(imgElon,cv2.COLOR_BGR2RGB)
# ##加载图片
# imgTest = face_recognition.load_image_file('ImagesBasic/elon test.jpg')
# ##将图片转换成RGB格式
# imgTest = cv2.cvtColor(imgTest,cv2.COLOR_BGR2RGB)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 人脸识别系统是一种利用计算机技术对人脸进行识别和验证的系统。其中,opencv人脸检测是一种基于opencv人脸检测算法,可以通过计算机视觉技术对图像或视频中的人脸进行检测和识别,具有高效、准确、实时等特点,广泛应用于安防、人机交互、智能家居等领域。 ### 回答2: 人脸识别系统是一种可以通过对人脸进行特征提取、比对和识别的技术,目前已广泛应用在生物特征识别、安防监控等领域。而OpenCV人脸检测是在计算机视觉领域中应用广泛的一种算法。 OpenCV是一个开源计算机视觉,提供了很多图像处理和机器视觉算法,其中人脸检测是OpenCV中应用最广泛的算法之一。OpenCV人脸检测的基本思路是利用Haar-like特征进行人脸检测。 Haar-like特征是一组由Viola和Jones在2001年提出的能够对图像进行分类的特征,主要由白色和黑色的矩形块组成。这些特征可以在人脸区域和非人脸区域产生显著的区别,因此可以用来进行人脸检测。在OpenCV中,利用Adaboost算法来训练分类器,从而实现人脸检测。 OpenCV人脸检测有以下几个优点: 1. 检测速度快:OpenCV人脸检测算法可以实现实时检测,能够处理实时视频,并对每一帧进行人脸检测。 2. 高检测率和低误检率:OpenCV人脸检测算法经过大量的训练和优化,能够准确地检测人脸,且误检率低。 3. 应用广泛:由于OpenCV是一个开源,其特性与应用广泛,可以应用于不同领域的人脸检测。 4. 动态人脸识别OpenCV人脸检测算法能够在不同角度、不同光照条件下对人脸进行检测和识别。 5. 简单易用:OpenCV提供了简单的API调用,即可完成人脸检测。同时,OpenCV还提供了丰富的文档和示例,使得人脸检测的实现变得更加简单。 总之,OpenCV人脸检测算法是一种可靠的人脸检测技术,可以广泛应用于不同领域。通过不断地优化和训练,OpenCV人脸检测算法仍有望在未来得到进一步的提升。 ### 回答3: 人脸识别是一种高科技应用,它可以在不进行人工干预的情况下识别人们的身份。在过去的几年里,随着计算机技术的不断发展壮大,人脸识别技术得到了迅速的发展和应用。 Opencv人脸检测是一种常见的人脸识别技术,它可以快速、准确地检测人脸并提取出相关的数据信息。Opencv人脸检测使用基于统计学的模型,可以快速检索出整张图像中的所有人脸,并用边缘高亮标出。其识别空间包括面部区域,由眼睛、口鼻、眉毛和脸型等特征组成。而为了提高识别的准确度,Opencv人脸检测还涉及到其他一些算法,比如特征提取、人脸分类和智能识别。 Opencv人脸检测是非常重要的安全工具,它可以用于认证和安全访问控制、图像搜索和媒体应用。在计算机视觉机器学习领域,Opencv人脸检测是重要的探究之一,因为对于如何解决图像多样性问题的机器人操作的研究而言,人脸检测是非常关键的。Opencv人脸检测还可以用于许多领域,如自然语言处理、光学字符识别等,进一步方便了计算机与人类之间的交流。 在未来,Opencv人脸检测技术有望得以发展与扩展,实现更加准确、精密的人脸识别,为广大人民群众的生产生活提供更多的便利与保障。诚然,Opencv人脸检测仅仅是人脸识别的一个小部分,但它在其中占有重要的地位,在此我们真诚地期待着Opencv人脸检测技术能够顺利地实现更深入的发展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值