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

news2024/12/23 16:54:51

  大家好,我是csdn的博主:lqj_本人

这是我的个人博客主页:lqj_本人的博客_CSDN博客-微信小程序,前端,vue领域博主lqj_本人擅长微信小程序,前端,vue,等方面的知识https://blog.csdn.net/lbcyllqj?spm=1000.2115.3001.5343

哔哩哔哩欢迎关注:小淼前端

小淼前端的个人空间_哔哩哔哩_bilibili

本篇文章主要讲述python的安装以及pycharm解释器的配置流程,本篇文章已经成功收录到我们python专栏中:https://blog.csdn.net/lbcyllqj/category_12089557.htmlicon-default.png?t=MBR7https://blog.csdn.net/lbcyllqj/category_12089557.html

 

前言

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

opencv库

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

opencv库的下载

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

pip install opencv-python    

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

首页 - OpenCV

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

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

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

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

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

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

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

抓取人脸功能模块

首先,导入cv库

import cv2

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

cap = cv2.VideoCapture(0)

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

while(cap.isOpened()):

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

ret_flag,Vshow = cap.read()

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

k = cv2.waitKey(1) & 0xFF

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

cv2.imshow('ceshi',Vshow)

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

if k == ord('s'):

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

 cv2.imwrite('E:/tupian/'+str(num)+'.name'+'.jpg',Vshow)
        print('保存成功'+str(num)+".jpg")
        print("-------------------------")
        num += 1

释放摄像头与内存:

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

完整代码:

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模块使用函数:

 pip install opencv-contrib-python

导入第三方库:

import os
import cv2
from PIL import Image
import numpy as np

存储人脸数据:

facesSamples=[]

存储姓名数据:

ids=[]

存储图片信息:

imagePaths=[os.path.join(path,f) for f in os.listdir(path)]

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

face_detector = cv2.CascadeClassifier('E:/open-cv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')

 遍历列表中的图片:

for imagePath in imagePaths:

将打开的图片灰度化:

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

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

 path = 'E:/tupian/'

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

faces,ids=getImageAndLabels(path)

加载识别器:

recognizer = cv2.face.LBPHFaceRecognizer_create()

训练数据:

 recognizer.train(faces,np.array(ids))

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

 recognizer.write('tupian/tupian.yml')

完整代码:

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

人脸识别功能模块

导入第三方库:

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

 完整代码:

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(不知道的状态)。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/185796.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最简单的k8s安装记录(包含dashboard)

使用sealos一键安装k8s集群 sealos-githubsealos使用文档 wget https://github.com/labring/sealos/releases/download/v4.1.4/sealos_4.1.4_linux_amd64.tar.gz && \tar -zxvf sealos_4.1.4_linux_amd64.tar.gz sealos && chmod x sealos && mv se…

编译原理学习笔记15——属性文法与语法制导翻译2

编译原理学习笔记15——属性文法与语法制导翻译215.1 S-属性文法15.2 L-属性文法15.3 翻译模式15.4 递归下降翻译器的设计15.1 S-属性文法 S-属性文法的自下而上计算 S-属性文法的自下而上计算 在分析栈中增加附加域存放综合属性值假设产生式A→XYZ对应的语义规则为a:f(X.x…

OAK深度相机操作温度范围说明

编辑:OAK中国 首发:Luxonis 喜欢的话,请多多👍⭐️✍ 内容可能会不定期更新,官网内容都是最新的,请查看首发地址链接。 ▌前言 Hello,大家好,这里是OAK中国,我是助手君。…

基于SMOKE多模式排放清单处理技术及EDGAR/MEIC清单制作与VOCs排放量核算

查看原文>>>基于SMOKE多模式排放清单处理技术及EDGAR/MEIC清单制作与VOCs排放量核算 随着我国经济快速发展,我国面临着日益严重的大气污染问题。近年来,严重的大气污染问题已经明显影响国计民生,引起政府、学界和人们越来越多的关注…

String类——Java中常见的类(模拟登录案例练习)

目录 String类的概述及构造方法(String类是Java中最常见的类) String的特点 String类的判断功能 模拟登录案例 ​ String类的获取功能 两个小练习 String类的转换功能和String类的其他功能 string类练习 String类的概述及构造方法(Str…

35/365 java 反射 Reflection Class类

1.动态语言 静态语言 动态语言: 运行时可以改变自身结构的语言eg: JavaScript, C#, PHP, Python 静态语言: 运行时结构不可变的语言eg: Java, C, CJava 不是动态语言,但通过反射机制获得了类似动态语言的特性,具有了一定的动态…

软件测试前沿技术:从中国新车评估规程谈谈自动化驾驶测试

背景C-NCAP全称China NewCarAssessmentProgramme,中国新车评估规程,是由E-NCAP发展而来,两者测试项目多数一致。E-NCAP全称是European NewCarAssessmentProgramme,译为欧洲新车评估规程,成立于1997年,是一个…

基于MirrorMaker与火山引擎的Kafka数据同步

Kafka MirrorMaker是Kafka官网提供的跨数据中心流数据同步方案,其实现原理是通过从Source集群消费消息,然后将消息生产到Target集群从而完成数据迁移操作。用户只需要通过简单的consumer配置和producer配置,启动MirrorMaker,即可实…

NCP1654BD65R2G高性能软开关功率因数校正电路芯片

NCP1654BD65R2G是一款用于连续导通模式 (CCM) 功率因数校正 (PFC) 步升预转换器的控制器。它在固定频率模式下控制电源开关导通时间 (PWM),取决于瞬时线圈电流。采用SOIC-8封装,最大程度减少了外部部件数量,并极大简化了 PFC 实施。它还集成了…

灰色预测模型一文详解+Python实例代码

目录 前言 一、模型理论 特点 二、模型场景 1.预测种类 2.适用条件 三、建模流程 1.级比校验 2.数据累加和微分方程构造 3.系数求解 4.残差检验与级比偏差检验 四、Python实例实现 总结 前言 博主参与过大大小小十次数学建模比赛,也获得了不少建模奖项…

19 | 三方协议怎么签?

前言 前言:简介三方协议签约的相关内容。 文章目录前言一. 什么是就业协议书二. 签约流程1. 网签流程(线上签约)三. 参考链接一. 什么是就业协议书 就业协议书俗称三方协议,是《全国普通高等学校毕业生就业协议书》的简称。 它是…

b站黑马Vue2后台管理项目笔记——(2)主页布局(整体,Header,左侧菜单布局)

说明: 此项目中使用的是本地SQL数据库,Vue2。 其他功能请见本人后续的其他相关文章。 本文内容实现的最终效果如下图: e.g.点击二级菜单用户列表,就会跳转到用户列表对应的index的地址(用户列表的indexpath是users&…

2023年山东最新道路运输安全员考试真题题库及答案

百分百题库提供道路运输安全员考试试题、道路运输安全员考试预测题、道路运输安全员考试真题、道路运输安全员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 题干:客运驾驶员从业行为定期考核结果应与企业安全生产奖惩制度…

Gradle 编译Server returned HTTP response code: 401 for URL

Gradle编译项目,Error:Server returned HTTP response code: 401 for URL: http://xxxxxxxxxx 解决方案 打开gradle-wrapper.properties文件 方法一:使用http协议:distributionUrlhttp://repo.xiaoman.cc/repository/gradle/gradle-6.8.2-b…

MCM箱模型实践技术应用与O3形成途径、生成潜势、敏感性分析

查看原文>>>https://mp.weixin.qq.com/s?__bizMzAxNzcxMzc5MQ&mid2247578057&idx4&sn9253a074df9937db3d258df14dd563ed&chksm9be2aed9ac9527cfdf270275d499452afded7a165944fdbbe345a4cb53fcd53548969d39c0c2&token850102049&langzh_CN#rd目…

剑指 Offer II 003 前 n 个数字二进制中 1 的个数

给定一个非负整数 n ,请计算 0 到 n 之间的每个数字的二进制表示中 1 的个数,并输出一个数组。 示例 1: 输入: n 2 输出: [0,1,1] 解释: 0 --> 0 1 --> 1 2 --> 10 示例 2: 输入: n 5 输出: [0,1,1,2,1,2] 解释: 0 --> 0 1 --> 1 2 …

Appium基础 — 获取toast信息

1、toast介绍Android中的toast是一种简易的消息提示框,toast提示框不能被用户点击,会根据所设置的显示时间自动消失。toas要appium1.6.3以上版本才支持,appium1.4的版本就别浪费时间了。再来看下toast长什么样,如下图:…

快速幂的几种实现方式

目录快速幂算法快速幂原理代码实现常规计算次幂的方法快速幂(一般)递归求快速幂位运算求快速幂快速幂算法 快速幂 快速幂还是很常用的,例如codeforce上的这道题目: 快速幂就是快速计算底数的n次幂。其时间复杂度为O(log₂N)O(log_₂N)O(log₂​N),与朴素的O(N)相比效率有了极…

SSM配置(备忘)

SSMSSM需要配置的文件配置applicationContext.xml配置database.properties配置mappers/ExamDao.xml在java目录下创建controller、dao、pojo、service目录控制类接口类(dao)实体类(pojo)服务层serviceservice接口类服务层实现类SSM SSM包含框架 spring s…

Linux(centos7)基本操作---用户权限

用户权限基本权限(UGO)设置权限设置属主,属组基本权限(ACL)特殊权限基本权限(UGO) 设置权限 权限的对象分为个人(u),组(g)&#xff…