前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python进阶——人工智能视觉识别

python进阶——人工智能视觉识别

作者头像
淼学派对
发布2023-10-14 10:55:06
2950
发布2023-10-14 10:55:06
举报
文章被收录于专栏:云开发小程序1

前言

python在人工智能方面可以毫不客气的说,比其他的所有语言都要有优势,因为python的背后有一个非常强大的资源库来支撑着python运作。

opencv库

opencv是最经典的python视觉库,它里面包含了很多种视觉的识别类型供开发者们使用。

opencv库的下载

我们可以在我们的pycharm里面输入以下代码进行下载,但这里我们下载的是阉割版的。

代码语言:javascript
复制
pip install opencv-python    

当我们的pycharm下载完成之后,我们呢还需要在opencv的官网进行下载:

首页 - OpenCV

然后我们选择(如下图所示):

 进入之后,我们就可以看到opencv相对应的版本了:

 然后,我们选择自己使用的系统进行下载并安装即可(仅安装即可,opencv不用环境配置!只需要记住安装在哪里,当我们使用的时候直接调取我们的安装目录就可以!)

当安装完成之后,我们就可以看到安装路径下的这些文件:

 里面包含眼睛识别,面部识别等一些强大的识别算法!

人脸检测报警系统(可用于:家用监控;人脸门禁;人脸打卡签到等)

这里我将本功能分为了三个py文件来展开描述:

抓取人脸功能模块

首先,导入cv库

代码语言:javascript
复制
import cv2

然后调取我们的摄像头(0代表本机摄像头,其他代表外接摄像头)

代码语言:javascript
复制
cap = cv2.VideoCapture(0)

用while来判断是否为开启状态:

代码语言:javascript
复制
while(cap.isOpened()):

得到每一帧的图片进行赋值:

代码语言:javascript
复制
ret_flag,Vshow = cap.read()

调用控制键盘函数,控制判断按键:

代码语言:javascript
复制
k = cv2.waitKey(1) & 0xFF

使用imshow函数显示拍摄图像:

代码语言:javascript
复制
cv2.imshow('ceshi',Vshow)

键盘监听,按s键进行保存:

代码语言:javascript
复制
if k == ord('s'):

保存拍摄图像的格式,打印提示文字:

代码语言:javascript
复制
 cv2.imwrite('E:/tupian/'+str(num)+'.name'+'.jpg',Vshow)
        print('保存成功'+str(num)+".jpg")
        print("-------------------------")
        num += 1

释放摄像头与内存:

代码语言:javascript
复制
#释放摄像头
cap.release()
#释放内存
cv2.destroyAllWindows()

完整代码:

代码语言:javascript
复制
import cv2
cap = cv2.VideoCapture(0)

falg = 1
num = 1

while(cap.isOpened()):#检测是否在开启状态
    ret_flag,Vshow = cap.read()#得到每一帧的图像
    k = cv2.waitKey(1) & 0xFF#判断按键
    cv2.imshow('ceshi',Vshow)#显示图像
    if k == ord('s'):#按s键保存
        cv2.imwrite('E:/tupian/'+str(num)+'.name'+'.jpg',Vshow)
        print('保存成功'+str(num)+".jpg")
        print("-------------------------")
        num += 1

    elif k == ord(' '):#退出
        break

#释放摄像头
cap.release()
#释放内存
cv2.destroyAllWindows()

录入人脸功能模块

在写这个功能模块之前,我们要在pycharm中或cmd中的本文件根目录下使用命令行,安装face模块使用函数:

代码语言:javascript
复制
 pip install opencv-contrib-python

导入第三方库:

代码语言:javascript
复制
import os
import cv2
from PIL import Image
import numpy as np

存储人脸数据:

代码语言:javascript
复制
facesSamples=[]

存储姓名数据:

代码语言:javascript
复制
ids=[]

存储图片信息:

代码语言:javascript
复制
imagePaths=[os.path.join(path,f) for f in os.listdir(path)]

加载分类器(就是我们上面讲到的在opencv官网下载的库,我们只需要调取安装目录就可以):

代码语言:javascript
复制
face_detector = cv2.CascadeClassifier('E:/open-cv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')

 遍历列表中的图片:

代码语言:javascript
复制
for imagePath in imagePaths:

将打开的图片灰度化:

代码语言:javascript
复制
PIL_img = Image.open(imagePath).convert('L')

将图片转化为数组:

代码语言:javascript
复制
img_numpy = np.array(PIL_img,'uint8')

获取图片人脸特征:

代码语言:javascript
复制
faces = face_detector.detectMultiScale(img_numpy)

获取每一张拍摄图片的id与姓名:

代码语言:javascript
复制
id = int(os.path.split(imagePath)[1].split('.')[0])

做判断,预防拍摄无面容图片:

代码语言:javascript
复制
        for x,y,w,h in faces:
            ids.append(id)
            facesSamples.append(img_numpy[y:y+h,x:x+w])

打印面部特征与id,并返回数据:

代码语言:javascript
复制
    print('id',id)
    print('fs:',facesSamples)
    return facesSamples,ids

调用图片路径(有第一步抓取人脸后按s键保存到'E:/tupian/'路径下的图片):

代码语言:javascript
复制
 path = 'E:/tupian/'

获取图像数组和id标签数组和姓名:

代码语言:javascript
复制
faces,ids=getImageAndLabels(path)

加载识别器:

代码语言:javascript
复制
recognizer = cv2.face.LBPHFaceRecognizer_create()

训练数据:

代码语言:javascript
复制
 recognizer.train(faces,np.array(ids))

保存面部特征到文件夹(创建一个文件夹,用于存放读取的面部信息):

代码语言:javascript
复制
 recognizer.write('tupian/tupian.yml')

完整代码:

代码语言:javascript
复制
import os
import cv2
from PIL import Image
import numpy as np

def getImageAndLabels(path):
    #储存人脸数据
    facesSamples=[]
    #储存姓名数据
    ids=[]
    #储存图片信息
    imagePaths=[os.path.join(path,f) for f in os.listdir(path)]
    #加载分类器
    face_detector = cv2.CascadeClassifier('E:/open-cv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
    #遍历列表中的图片
    for imagePath in imagePaths:
        #打开图片,灰度化PIL有九种不同的模式:1,L,P,RGB,RGBA,CMYK,YCbCr,I,F
        PIL_img = Image.open(imagePath).convert('L')
        #将图像转化为数组,以黑白深浅
        img_numpy = np.array(PIL_img,'uint8')
        #获取图片人脸特征
        faces = face_detector.detectMultiScale(img_numpy)
        #获取每一张图片的id和姓名
        id = int(os.path.split(imagePath)[1].split('.')[0])
        #预防无面容照片
        for x,y,w,h in faces:
            ids.append(id)
            facesSamples.append(img_numpy[y:y+h,x:x+w])
        #打印面部特征和id
    print('id',id)
    print('fs:',facesSamples)
    return facesSamples,ids

if __name__ == '__main__':
    #图片路径
    path = 'E:/tupian/'
    #获取图像数组和id标签数组和姓名
    faces,ids=getImageAndLabels(path)
    #加载识别器
    recognizer = cv2.face.LBPHFaceRecognizer_create()
    #训练
    recognizer.train(faces,np.array(ids))
    #保存文件
    recognizer.write('tupian/tupian.yml')

人脸识别功能模块

导入第三方库:

代码语言:javascript
复制
import cv2
import os

加载训练过的数据文件:

代码语言:javascript
复制
recogizer = cv2.face.LBPHFaceRecognizer_create()

加载保存过的面部信息:

代码语言:javascript
复制
recogizer.read('tupian/tupian.yml')

定义名称数组:

代码语言:javascript
复制
names=[]

识别全局变量定义:

代码语言:javascript
复制
warningtime = 0

识别视频中人脸模块:

代码语言:javascript
复制
def face_detect_demo(img):
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#转换为灰度
    face_detector=cv2.CascadeClassifier('E:/open-cv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
    face=face_detector.detectMultiScale(gray)
    for x,y,w,h in face:
        cv2.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)
        cv2.circle(img,center=(x+w//2,y+h//2),radius=w//2,color=(0,255,0),thickness=1)
        # 人脸识别
        ids, confidence = recogizer.predict(gray[y:y + h, x:x + w])
        if confidence > 80:
            global warningtime
            warningtime += 1
            if warningtime > 100:
               # warning()
               warningtime = 0
            cv2.putText(img, 'unkonw', (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)
        else:
            cv2.putText(img,str(names[ids-1]), (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)
    cv2.imshow('result',img)

导入存储的图片名字标签:

代码语言:javascript
复制
def name():
    path = 'E:/tupian/'
    # names = []
    imagePaths=[os.path.join(path,f) for f in os.listdir(path)]
    for imagePath in imagePaths:
       name = str(os.path.split(imagePath)[1].split('.',2)[1])
       names.append(name)

加载监控或已保存下来的视频:

代码语言:javascript
复制
cap=cv2.VideoCapture('1.mp4')
name()
while True:
    flag,frame=cap.read()
    if not flag:
        break
    face_detect_demo(frame)
    if ord(' ') == cv2.waitKey(10):
        break

释放内存与视频:

代码语言:javascript
复制
cv2.destroyAllWindows()
cap.release()

 完整代码:

代码语言:javascript
复制
import cv2
import os
#加载训练数据文件
recogizer = cv2.face.LBPHFaceRecognizer_create()
#加载数据
recogizer.read('tupian/tupian.yml')
#名称
names=[]
#报警全局变量
warningtime = 0
#准备识别的图片
def face_detect_demo(img):
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#转换为灰度
    face_detector=cv2.CascadeClassifier('E:/open-cv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
    face=face_detector.detectMultiScale(gray)
    for x,y,w,h in face:
        cv2.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)
        cv2.circle(img,center=(x+w//2,y+h//2),radius=w//2,color=(0,255,0),thickness=1)
        # 人脸识别
        ids, confidence = recogizer.predict(gray[y:y + h, x:x + w])
        if confidence > 80:
            global warningtime
            warningtime += 1
            if warningtime > 100:
               # warning()
               warningtime = 0
            cv2.putText(img, 'unkonw', (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)
        else:
            cv2.putText(img,str(names[ids-1]), (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)
    cv2.imshow('result',img)

#名字标签
def name():
    path = 'E:/tupian/'
    # names = []
    imagePaths=[os.path.join(path,f) for f in os.listdir(path)]
    for imagePath in imagePaths:
       name = str(os.path.split(imagePath)[1].split('.',2)[1])
       names.append(name)
#加载视频
cap=cv2.VideoCapture('1.mp4')
name()
while True:
    flag,frame=cap.read()
    if not flag:
        break
    face_detect_demo(frame)
    if ord(' ') == cv2.waitKey(10):
        break
#释放内存+视频
cv2.destroyAllWindows()
cap.release()

最终显示效果:

录入过的面部信息就会显示录入的姓名(如下面的LQJ),未录入过的面部信息就会显示unkonw(不知道的状态)。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-10-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • opencv库
    • opencv库的下载
    • 人脸检测报警系统(可用于:家用监控;人脸门禁;人脸打卡签到等)
      • 抓取人脸功能模块
        • 录入人脸功能模块
          • 人脸识别功能模块
          • 最终显示效果:
          相关产品与服务
          人脸识别
          腾讯云神图·人脸识别(Face Recognition)基于腾讯优图强大的面部分析技术,提供包括人脸检测与分析、比对、搜索、验证、五官定位、活体检测等多种功能,为开发者和企业提供高性能高可用的人脸识别服务。 可应用于在线娱乐、在线身份认证等多种应用场景,充分满足各行业客户的人脸属性识别及用户身份确认等需求。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档