飞道的博客

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

458人阅读  评论(0)

  大家好,我是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.htmlhttps://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'):

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


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

释放摄像头与内存:


  
  1. #释放摄像头
  2. cap.release()
  3. #释放内存
  4. cv2.destroyAllWindows()

完整代码:


  
  1. import cv2
  2. cap = cv2.VideoCapture( 0)
  3. falg = 1
  4. num = 1
  5. while(cap.isOpened()): #检测是否在开启状态
  6. ret_flag,Vshow = cap.read() #得到每一帧的图像
  7. k = cv2.waitKey( 1) & 0xFF #判断按键
  8. cv2.imshow( 'ceshi',Vshow) #显示图像
  9. if k == ord( 's'): #按s键保存
  10. cv2.imwrite( 'E:/tupian/'+ str(num)+ '.name'+ '.jpg',Vshow)
  11. print( '保存成功'+ str(num)+ ".jpg")
  12. print( "-------------------------")
  13. num += 1
  14. elif k == ord( ' '): #退出
  15. break
  16. #释放摄像头
  17. cap.release()
  18. #释放内存
  19. cv2.destroyAllWindows()

录入人脸功能模块

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

 pip install opencv-contrib-python

导入第三方库:


  
  1. import os
  2. import cv2
  3. from PIL import Image
  4. 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])

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


  
  1. for x,y,w,h in faces:
  2. ids.append( id)
  3. facesSamples.append(img_numpy[y:y+h,x:x+w])

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


  
  1. print( 'id', id)
  2. print( 'fs:',facesSamples)
  3. 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')

完整代码:


  
  1. import os
  2. import cv2
  3. from PIL import Image
  4. import numpy as np
  5. def getImageAndLabels( path):
  6. #储存人脸数据
  7. facesSamples=[]
  8. #储存姓名数据
  9. ids=[]
  10. #储存图片信息
  11. imagePaths=[os.path.join(path,f) for f in os.listdir(path)]
  12. #加载分类器
  13. face_detector = cv2.CascadeClassifier( 'E:/open-cv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
  14. #遍历列表中的图片
  15. for imagePath in imagePaths:
  16. #打开图片,灰度化PIL有九种不同的模式:1,L,P,RGB,RGBA,CMYK,YCbCr,I,F
  17. PIL_img = Image. open(imagePath).convert( 'L')
  18. #将图像转化为数组,以黑白深浅
  19. img_numpy = np.array(PIL_img, 'uint8')
  20. #获取图片人脸特征
  21. faces = face_detector.detectMultiScale(img_numpy)
  22. #获取每一张图片的id和姓名
  23. id = int(os.path.split(imagePath)[ 1].split( '.')[ 0])
  24. #预防无面容照片
  25. for x,y,w,h in faces:
  26. ids.append( id)
  27. facesSamples.append(img_numpy[y:y+h,x:x+w])
  28. #打印面部特征和id
  29. print( 'id', id)
  30. print( 'fs:',facesSamples)
  31. return facesSamples,ids
  32. if __name__ == '__main__':
  33. #图片路径
  34. path = 'E:/tupian/'
  35. #获取图像数组和id标签数组和姓名
  36. faces,ids=getImageAndLabels(path)
  37. #加载识别器
  38. recognizer = cv2.face.LBPHFaceRecognizer_create()
  39. #训练
  40. recognizer.train(faces,np.array(ids))
  41. #保存文件
  42. recognizer.write( 'tupian/tupian.yml')

人脸识别功能模块

导入第三方库:


  
  1. import cv2
  2. import os

加载训练过的数据文件:

recogizer = cv2.face.LBPHFaceRecognizer_create()

加载保存过的面部信息:

recogizer.read('tupian/tupian.yml')

定义名称数组:

names=[]

识别全局变量定义:

warningtime = 0

识别视频中人脸模块:


  
  1. def face_detect_demo( img):
  2. gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #转换为灰度
  3. face_detector=cv2.CascadeClassifier( 'E:/open-cv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
  4. face=face_detector.detectMultiScale(gray)
  5. for x,y,w,h in face:
  6. cv2.rectangle(img,(x,y),(x+w,y+h),color=( 0, 0, 255),thickness= 2)
  7. cv2.circle(img,center=(x+w// 2,y+h// 2),radius=w// 2,color=( 0, 255, 0),thickness= 1)
  8. # 人脸识别
  9. ids, confidence = recogizer.predict(gray[y:y + h, x:x + w])
  10. if confidence > 80:
  11. global warningtime
  12. warningtime += 1
  13. if warningtime > 100:
  14. # warning()
  15. warningtime = 0
  16. cv2.putText(img, 'unkonw', (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, ( 0, 255, 0), 1)
  17. else:
  18. cv2.putText(img, str(names[ids- 1]), (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, ( 0, 255, 0), 1)
  19. cv2.imshow( 'result',img)

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


  
  1. def name():
  2. path = 'E:/tupian/'
  3. # names = []
  4. imagePaths=[os.path.join(path,f) for f in os.listdir(path)]
  5. for imagePath in imagePaths:
  6. name = str(os.path.split(imagePath)[ 1].split( '.', 2)[ 1])
  7. names.append(name)

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


  
  1. cap=cv2.VideoCapture( '1.mp4')
  2. name()
  3. while True:
  4. flag,frame=cap.read()
  5. if not flag:
  6. break
  7. face_detect_demo(frame)
  8. if ord( ' ') == cv2.waitKey( 10):
  9. break

释放内存与视频:


  
  1. cv2.destroyAllWindows()
  2. cap.release()

 完整代码:


  
  1. import cv2
  2. import os
  3. #加载训练数据文件
  4. recogizer = cv2.face.LBPHFaceRecognizer_create()
  5. #加载数据
  6. recogizer.read( 'tupian/tupian.yml')
  7. #名称
  8. names=[]
  9. #报警全局变量
  10. warningtime = 0
  11. #准备识别的图片
  12. def face_detect_demo( img):
  13. gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #转换为灰度
  14. face_detector=cv2.CascadeClassifier( 'E:/open-cv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
  15. face=face_detector.detectMultiScale(gray)
  16. for x,y,w,h in face:
  17. cv2.rectangle(img,(x,y),(x+w,y+h),color=( 0, 0, 255),thickness= 2)
  18. cv2.circle(img,center=(x+w// 2,y+h// 2),radius=w// 2,color=( 0, 255, 0),thickness= 1)
  19. # 人脸识别
  20. ids, confidence = recogizer.predict(gray[y:y + h, x:x + w])
  21. if confidence > 80:
  22. global warningtime
  23. warningtime += 1
  24. if warningtime > 100:
  25. # warning()
  26. warningtime = 0
  27. cv2.putText(img, 'unkonw', (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, ( 0, 255, 0), 1)
  28. else:
  29. cv2.putText(img, str(names[ids- 1]), (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, ( 0, 255, 0), 1)
  30. cv2.imshow( 'result',img)
  31. #名字标签
  32. def name():
  33. path = 'E:/tupian/'
  34. # names = []
  35. imagePaths=[os.path.join(path,f) for f in os.listdir(path)]
  36. for imagePath in imagePaths:
  37. name = str(os.path.split(imagePath)[ 1].split( '.', 2)[ 1])
  38. names.append(name)
  39. #加载视频
  40. cap=cv2.VideoCapture( '1.mp4')
  41. name()
  42. while True:
  43. flag,frame=cap.read()
  44. if not flag:
  45. break
  46. face_detect_demo(frame)
  47. if ord( ' ') == cv2.waitKey( 10):
  48. break
  49. #释放内存+视频
  50. cv2.destroyAllWindows()
  51. cap.release()

最终显示效果:

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

 

 


转载:https://blog.csdn.net/lbcyllqj/article/details/128801971
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场