python图像处理入门(四)

上一次进行了读取图片的人脸识别,这一次要进行一点不一样的事情,所以我们要再进步一点,如果使用我们电脑的摄像头,并且可以读取出我们的人脸,这样会更酷一点。那么大概的思路其实是这样的,视频识别和人脸识别的区别其实是从视频中读取出一帧的图像处理,再用上一次的处理办法,框出我们识别出的人脸,就可以了

一、获取摄像头

之前学习Android开发的时候,如果开发的应用需要摄像头的话是需要获取到摄像头权限的,这一次使用python想着会不会也需要这样做,然后查了一下,发现真的是要方便很多,直接获取就可以了。具体方法是这样的:

cap = cv2.VideoCapture(0) 

是的,opencv中支持了直接使用摄像头,这里的参数是0,看到有一位大佬电脑配了不止一个摄像头,这里就会修改参数,类似于摄像头的编号,比如我装了三个摄像头,这里的参数可能设置为0-2都是可以的。

然后的工作和之前的类似,首先我们要获取到识别器,具体操作这样:

face_cascade = cv2.CascadeClassifier(r'haarcascade_frontalface_default.xml') 

然后把它加载进来

face_cascade.load('E:\\anaconda\\pkgs\\libopencv-3.4.1-h875b8b8_3\\Library\\etc\\haarcascades\\haarcascade_frontalface_default.xml')

二、后续处理

从上一次我们大概知道,至少现阶段我做的图像处理都是先转换为灰色,再处理,这一次也是这样,先读取视频中的一帧,再转换为灰色的:

ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 

然后通过我们上次说的通过使用detectMultiScale函数,调整参数完成识别,这里不再赘述

需要说的是这里其实是需要一个while(true)的循环来一直处理的,为什么?因为这是一个视频呀,而且是打开摄像头获取到的视频,如果我们不关闭摄像头的话甚至可以认为这是一段无限长的视频,使用一个这样的循环保证我们可以对每一帧图像进行处理,持续地对人脸进行识别。

三、遇到的问题

运行时遇到了这样的问题:

error: (-215) scn == 3 || scn == 4 in function cv::cvtColor

上网查看了一下,对代码做了一定的改进,对上述读取出的ret进行判断,如果为true的话再开始转灰度,否则的话则终止,查了一下videoCapture.read这个函数返回的两个参数的意义,ret表示对当前帧的判断,如果是一张合法的帧或者说,是一张可处理的帧,才返回true,否则返回false,frame则返回的是我们获取到的帧对象,所以这个报错信息大概可能是因为有些帧不合法而我们紧接着就进行了灰度转换,这时候就会出错,所以以后如果还要使用这个函数的话还是记得对ret这个返回值有一个判断会比较好,否则可能会出错

四、程序

# -*- coding: utf-8 -*-
"""
Created on Sat Mar 23 14:43:48 2019

@author: Administrator
"""

import cv2
cap = cv2.VideoCapture(0) 
face_cascade = cv2.CascadeClassifier(r'haarcascade_frontalface_default.xml') # 加载人脸特征库
face_cascade.load('E:\\anaconda\\pkgs\\libopencv-3.4.1-h875b8b8_3\\Library\\etc\\haarcascades\\haarcascade_frontalface_default.xml')
while(True):
    ret, frame = cap.read() 
    if ret is True: 
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 

    else:   

        break
 
    faces = face_cascade.detectMultiScale(gray, scaleFactor = 1.15, minNeighbors = 5, minSize = (5, 5)) 
    for(x, y, w, h) in faces:
        cv2.rectangle(gray, (x, y), (x + w, y + h), (0, 0, 255), 2) 
 
    cv2.imshow('Face Recognition', gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release() 
cv2.destroyAllWindows()

五、效果(马赛克版)

嗯中间还测试了一下,即使移动,也可以识别出来,而且由于我们使用了一个死循环的方式,点击关闭之后还会弹出视频窗口

猜你喜欢

转载自blog.csdn.net/LieberVater/article/details/88761448