• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

极快通过pycharm搭建python+opencv实现人脸检测

武飞扬头像
超561
帮助1

学新通

 首先导入opencv

1代码实现效果,在界面下显示所要显示的图片

在同一目录下存放显示的图片

img = cv.imread('face1.jpg')函数字符串变量填写存放照片的名字

为了让人眼看到照片所以使用cv.waitKey(0),起到delay的作用

  1.  
    #导入cv模块
  2.  
    import cv2 as cv
  3.  
    #读取图片
  4.  
    img = cv.imread('face1.jpg')
  5.  
    #显示图片
  6.  
    cv.imshow('read_img',img)
  7.  
    #等待
  8.  
    cv.waitKey(0)
  9.  
    #释放内存
  10.  
    cv.destroyAllWindows()

2代码实现效果对图片进行灰度转换

灰度转换可以让计算机更轻易对图片进行识别

此函数用来进行图片的灰度转换 gray_img = cv.cvtColor(img,cv.COLOR_BGR2GRAY)

  1.  
    #导入cv模块
  2.  
    import cv2 as cv
  3.  
    #读取图片
  4.  
    img = cv.imread('face1.jpg')
  5.  
    #灰度转换
  6.  
    gray_img = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
  7.  
    #显示灰度图片
  8.  
    cv.imshow('gray',gray_img)
  9.  
    #保存灰度图片
  10.  
    cv.imwrite('gray_face1.jpg',gray_img)
  11.  
    #显示图片
  12.  
    cv.imshow('read_img',img)
  13.  
    #等待
  14.  
    cv.waitKey(0)
  15.  
    #释放内存
  16.  
    cv.destroyAllWindows()
  17.  
     
学新通

3代码修改图片尺寸

为了让所有图片都能按要求显示所以修改图片尺寸

resize_img = cv.resize(img,dsize=(200,200))此函数用来修改图片的尺寸

  1.  
    #导入cv模块
  2.  
    import cv2 as cv
  3.  
    #读取图片
  4.  
    img = cv.imread('face1.jpg')
  5.  
    #修改尺寸
  6.  
    resize_img = cv.resize(img,dsize=(200,200))
  7.  
    #显示原图
  8.  
    cv.imshow('img',img)
  9.  
    #显示修改后的
  10.  
    cv.imshow('resize_img',resize_img)
  11.  
    #打印原图尺寸大小
  12.  
    print('未修改:',img.shape)
  13.  
    #打印修改后的大小
  14.  
    print('修改后:',resize_img.shape)
  15.  
    #等待
  16.  
    while True:
  17.  
    if ord('q') == cv.waitKey(0):
  18.  
    break
  19.  
    #释放内存
  20.  
    cv.destroyAllWindows()
  21.  
     
学新通

4绘制矩形圆形

在进行人脸检测时会将所要检测的目标用图形框选出来所以需要绘制图形
(1)cv.rectangle(img,(x,y,x w,y h),color=(0,0,255),thickness=1)此函数用来绘制矩形第一个参数用来指定在哪一个图片上绘制,第二个参数指定绘制矩形的位置,长和宽.第三个参数用来选定绘制矩形的颜色,第四个参数用来选择绘制矩形线条的粗细.

(2)cv.circle(img,center=(x w,y h),radius=100,color=(255,0,0),thickness=5)此函数用来绘制圆形,第一个参数指定在哪个图片上绘制,第二个参数是圆心的坐标,第三个参数是圆的半径,第四个参数是绘制圆形线条的粗细

  1.  
    #导入cv模块
  2.  
    import cv2 as cv
  3.  
    #读取图片
  4.  
    img = cv.imread('face1.jpg')
  5.  
    #坐标
  6.  
    x,y,w,h = 100,100,100,100
  7.  
    #绘制矩形
  8.  
    cv.rectangle(img,(x,y,x w,y h),color=(0,0,255),thickness=1)
  9.  
    #绘制圆形
  10.  
    cv.circle(img,center=(x w,y h),radius=100,color=(255,0,0),thickness=5)
  11.  
    #显示
  12.  
    cv.imshow('re_img',img)
  13.  
    while True:
  14.  
    if ord('q') == cv.waitKey(0):
  15.  
    break
  16.  
    #释放内存
  17.  
    cv.destroyAllWindows()
  18.  
     
学新通

5人脸检测

人脸检测中核心函数为face_detect_demo()

  1.  
    #检测函数
  2.  
    def face_detect_demo():
  3.  
        gary = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
  4.  
        face_detect = cv.CascadeClassifier('D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_alt2.xml')
  5.  
        face = face_detect.detectMultiScale(gary,1.01,5,0,(100,100),(300,300))
  6.  
        for x,y,w,h in face:
  7.  
            cv.rectangle(img,(x,y),(x w,y h),color=(0,0,255),thickness=2)
  8.  
        cv.imshow('result',img)


1注意在cv.CascadeClassifier()中位置一定要选择此时你计算机安装cv的路径中的目标文件

  1.  
    #导入cv模块
  2.  
    import cv2 as cv
  3.  
    #检测函数
  4.  
    def face_detect_demo():
  5.  
    gary = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
  6.  
    face_detect = cv.CascadeClassifier('D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_alt2.xml')
  7.  
    face = face_detect.detectMultiScale(gary,1.01,5,0,(100,100),(300,300))
  8.  
    for x,y,w,h in face:
  9.  
    cv.rectangle(img,(x,y),(x w,y h),color=(0,0,255),thickness=2)
  10.  
    cv.imshow('result',img)
  11.  
     
  12.  
    #读取图像
  13.  
    img = cv.imread('face1.jpg')
  14.  
    #检测函数
  15.  
    face_detect_demo()
  16.  
    #等待
  17.  
    while True:
  18.  
    if ord('q') == cv.waitKey(0):
  19.  
    break
  20.  
    #释放内存
  21.  
    cv.destroyAllWindows()
学新通

6多个目标检测

在进行多个目标检测时只是改变了cv.CascadeClassifier()参数中的目标文件

  1.  
    #导入cv模块
  2.  
    import cv2 as cv
  3.  
    #检测函数
  4.  
    def face_detect_demo():
  5.  
    gary = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
  6.  
    face_detect = cv.CascadeClassifier('D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
  7.  
    face = face_detect.detectMultiScale(gary)
  8.  
    for x,y,w,h in face:
  9.  
    cv.rectangle(img,(x,y),(x w,y h),color=(0,0,255),thickness=2)
  10.  
    cv.imshow('result',img)
  11.  
     
  12.  
    #读取图像
  13.  
    img = cv.imread('face2.jpg')
  14.  
    #检测函数
  15.  
    face_detect_demo()
  16.  
    #等待
  17.  
    while True:
  18.  
    if ord('q') == cv.waitKey(0):
  19.  
    break
  20.  
    #释放内存
  21.  
    cv.destroyAllWindows()
  22.  
     
  23.  
     
学新通

7视频检测

在下面函数中如果参数传入的是0则将打开默认的摄像头,也可以传入视频

#读取摄像头
cap = cv.VideoCapture(0)

  1.  
    #导入cv模块
  2.  
    import cv2 as cv
  3.  
    #检测函数
  4.  
    def face_detect_demo(img):
  5.  
    gary = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
  6.  
    face_detect = cv.CascadeClassifier('D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
  7.  
    face = face_detect.detectMultiScale(gary)
  8.  
    for x,y,w,h in face:
  9.  
    cv.rectangle(img,(x,y),(x w,y h),color=(0,0,255),thickness=2)
  10.  
    cv.imshow('result',img)
  11.  
     
  12.  
    #读取摄像头
  13.  
    cap = cv.VideoCapture(0)
  14.  
    #循环
  15.  
    while True:
  16.  
    flag,frame = cap.read()
  17.  
    if not flag:
  18.  
    break
  19.  
    face_detect_demo(frame)
  20.  
    if ord('q') == cv.waitKey(1):
  21.  
    break
  22.  
    #释放内存
  23.  
    cv.destroyAllWindows()
  24.  
    #释放摄像头
  25.  
    cap.release()
  26.  
     
学新通

8人脸信息录入

  1.  
    #导入模块
  2.  
    import cv2
  3.  
    #摄像头
  4.  
    cap=cv2.VideoCapture(0)
  5.  
     
  6.  
    falg = 1
  7.  
    num = 1
  8.  
     
  9.  
    while(cap.isOpened()):#检测是否在开启状态
  10.  
    ret_flag,Vshow = cap.read()#得到每帧图像
  11.  
    cv2.imshow("Capture_Test",Vshow)#显示图像
  12.  
    k = cv2.waitKey(1) & 0xFF#按键判断
  13.  
    if k == ord('s'):#保存
  14.  
    cv2.imwrite("D:/opencv_date/" str(num) ".cjc" ".jpg",Vshow)
  15.  
    print("success to save" str(num) ".jpg")
  16.  
    print("-------------------")
  17.  
    num = 1
  18.  
    elif k == ord(' '):#退出
  19.  
    break
  20.  
    #释放摄像头
  21.  
    cap.release()
  22.  
    #释放内存
  23.  
    cv2.destroyAllWindows()
学新通

9模型训练

  1.  
    import os
  2.  
    import cv2
  3.  
    from PIL import Image
  4.  
    import numpy as np
  5.  
     
  6.  
    def getImageAndLabels(path):
  7.  
    facesSamples = []
  8.  
    ids = []
  9.  
    imagePaths=[os.path.join(path,f) for f in os.listdir(path)]
  10.  
    # 检测人脸
  11.  
    face_detector = cv2.CascadeClassifier('D:\OpenCV\OPENCV(WIN)\opencv\sources\data\haarcascades\haarcascade_frontalface_alt2.xml')
  12.  
    # 打印数组imagePaths
  13.  
    print('数据排列:',imagePaths)
  14.  
    # 遍历列表中的图片
  15.  
    for imagePath in imagePaths:
  16.  
    #打开图片,黑白化
  17.  
    PIL_img=Image.open(imagePath).convert('L')
  18.  
    #将图像转换为数组,以黑白深浅
  19.  
    # PIL_img = cv2.resize(PIL_img, dsize=(400, 400))
  20.  
    img_numpy=np.array(PIL_img,'uint8')
  21.  
    #获取图片人脸特征
  22.  
    faces = face_detector.detectMultiScale(img_numpy)
  23.  
    #获取每张图片的id和姓名
  24.  
    id = int(os.path.split(imagePath)[1].split('.')[0])
  25.  
    #预防无面容照片
  26.  
    for x,y,w,h in faces:
  27.  
    ids.append(id)
  28.  
    facesSamples.append(img_numpy[y:y h,x:x w])
  29.  
    #打印脸部特征和id
  30.  
    #print('fs:', facesSamples)
  31.  
    print('id:', id)
  32.  
    #print('fs:', facesSamples[id])
  33.  
    print('fs:', facesSamples)
  34.  
    #print('脸部例子:',facesSamples[0])
  35.  
    #print('身份信息:',ids[0])
  36.  
    return facesSamples,ids
  37.  
     
  38.  
    if __name__ == '__main__':
  39.  
    #图片路径
  40.  
    path='D:\opencv_date'
  41.  
    #获取图像数组和id标签数组和姓名
  42.  
    faces,ids=getImageAndLabels(path)
  43.  
    #获取训练对象
  44.  
    recognizer=cv2.face.LBPHFaceRecognizer_create()
  45.  
    #recognizer.train(faces,names)#np.array(ids)
  46.  
    recognizer.train(faces,np.array(ids))
  47.  
    #保存文件
  48.  
    recognizer.write('trainer/trainer.yml')
  49.  
    #save_to_file('names.txt',names)
  50.  
     
  51.  
     
  52.  
     
学新通

10人脸识别

  1.  
    import cv2
  2.  
    import numpy as np
  3.  
    import os
  4.  
    # coding=utf-8
  5.  
    import urllib
  6.  
    import urllib.request
  7.  
    import hashlib
  8.  
     
  9.  
    #加载训练数据集文件
  10.  
    recogizer=cv2.face.LBPHFaceRecognizer_create()
  11.  
    recogizer.read('trainer/trainer.yml')
  12.  
    names=[]
  13.  
    warningtime = 0
  14.  
     
  15.  
    def md5(str):
  16.  
    import hashlib
  17.  
    m = hashlib.md5()
  18.  
    m.update(str.encode("utf8"))
  19.  
    return m.hexdigest()
  20.  
     
  21.  
    statusStr = {
  22.  
    '0': '短信发送成功',
  23.  
    '-1': '参数不全',
  24.  
    '-2': '服务器空间不支持,请确认支持curl或者fsocket,联系您的空间商解决或者更换空间',
  25.  
    '30': '密码错误',
  26.  
    '40': '账号不存在',
  27.  
    '41': '余额不足',
  28.  
    '42': '账户已过期',
  29.  
    '43': 'IP地址限制',
  30.  
    '50': '内容含有敏感词'
  31.  
    }
  32.  
     
  33.  
     
  34.  
    def warning():
  35.  
    smsapi = "http://api.smsbao.com/"
  36.  
    # 短信平台账号
  37.  
    user = '13******10'
  38.  
    # 短信平台密码
  39.  
    password = md5('*******')
  40.  
    # 要发送的短信内容
  41.  
    content = '【报警】\n原因:检测到未知人员\n地点:xxx'
  42.  
    # 要发送短信的手机号码
  43.  
    phone = '*******'
  44.  
     
  45.  
    data = urllib.parse.urlencode({'u': user, 'p': password, 'm': phone, 'c': content})
  46.  
    send_url = smsapi 'sms?' data
  47.  
    response = urllib.request.urlopen(send_url)
  48.  
    the_page = response.read().decode('utf-8')
  49.  
    print(statusStr[the_page])
  50.  
     
  51.  
    #准备识别的图片
  52.  
    def face_detect_demo(img):
  53.  
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#转换为灰度
  54.  
    face_detector=cv2.CascadeClassifier('D:\OpenCV\OPENCV(WIN)\opencv\sources\data\haarcascades\haarcascade_frontalface_alt2.xml')
  55.  
    face=face_detector.detectMultiScale(gray,1.1,5,cv2.CASCADE_SCALE_IMAGE,(100,100),(300,300))
  56.  
    #face=face_detector.detectMultiScale(gray)
  57.  
    for x,y,w,h in face:
  58.  
    cv2.rectangle(img,(x,y),(x w,y h),color=(0,0,255),thickness=2)
  59.  
    cv2.circle(img,center=(x w//2,y h//2),radius=w//2,color=(0,255,0),thickness=1)
  60.  
    # 人脸识别
  61.  
    ids, confidence = recogizer.predict(gray[y:y h, x:x w])
  62.  
    #print('标签id:',ids,'置信评分:', confidence)
  63.  
    if confidence > 80:
  64.  
    global warningtime
  65.  
    warningtime = 1
  66.  
    if warningtime > 100:
  67.  
    warning()
  68.  
    warningtime = 0
  69.  
    cv2.putText(img, 'unkonw', (x 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)
  70.  
    else:
  71.  
    cv2.putText(img,str(names[ids-1]), (x 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)
  72.  
    cv2.imshow('result',img)
  73.  
    #print('bug:',ids)
  74.  
     
  75.  
    def name():
  76.  
    path = 'D:\opencv_date'
  77.  
    #names = []
  78.  
    imagePaths=[os.path.join(path,f) for f in os.listdir(path)]
  79.  
    for imagePath in imagePaths:
  80.  
    name = str(os.path.split(imagePath)[1].split('.',2)[1])
  81.  
    names.append(name)
  82.  
     
  83.  
     
  84.  
    cap=cv2.VideoCapture('1.mp4')
  85.  
    name()
  86.  
    while True:
  87.  
    flag,frame=cap.read()
  88.  
    if not flag:
  89.  
    break
  90.  
    face_detect_demo(frame)
  91.  
    if ord(' ') == cv2.waitKey(10):
  92.  
    break
  93.  
    cv2.destroyAllWindows()
  94.  
    cap.release()
学新通

11网页视频

  1.  
    import cv2
  2.  
     
  3.  
    class CaptureVideo(object):
  4.  
    def net_video(self):
  5.  
    # 获取网络视频流
  6.  
    #cam = cv2.VideoCapture("rtmp://192.168.0.10/live/test")
  7.  
    cam = cv2.VideoCapture("rtmp://58.200.131.2:1935/livetv/hunantv")
  8.  
    while cam.isOpened():
  9.  
    sucess, frame = cam.read()
  10.  
    cv2.imshow("Network", frame)
  11.  
    cv2.waitKey(1)
  12.  
    if __name__ == "__main__":
  13.  
    capture_video = CaptureVideo()

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfkffe
系列文章
更多 icon
同类精品
更多 icon
继续加载