环境及软件:Ubuntu16.04.5 opencv2.4.13.6 python3 vim
首先是打开摄像头:
之前用C++实现过打开电脑摄像头,但并没有记录下来,这次python遇到的问题比上次多,所以简要的记录一下过程。
首先最基本的命令 vim test.py建立一个python脚本,:!python % 用来执行python程序。
代码如下:
import cv2
cap = cv2.VideoCapture(1) #视频进行读取操作以及调用摄像头
width = 640#宽度
ret = cap.set(3, width)
height = 480#高度
ret = cap.set(4, height)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('out.avi', fourcc, 20.0, (width, height))
while cap.isOpened(): #判断视频读取或者摄像头调用是否成功,成功则返回true。
ret, frame = cap.read()#返回给ret的是摄像头调用是否成功的结果,返回给frame的为获取到的视频
if ret is True:
print('frame shape:',frame.shape)
frame = cv2.resize(frame, (640, 480))
out.write(frame)
cv2.imshow('frame', frame)
else:
break
key = cv2.waitKey(1)
if key == ord('q'):
break
cap.release()
out.release()
cv2.destroyAllWindows()
这里需要注意的是cap = cv2.VideoCapture(1)此处如果不通的话可以试一下0,因为代码是从网上各个地方找的,我用0的时候是不对的,改成1可以,此处需要注意一下。
其中遇到 类似
File “test.py”, line 3
SyntaxError: Non-ASCII character ‘\xe5’ in file test.py on line 3, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
问题在代码前两行加上
#!usr/bin/python
# -*- coding: utf-8 -*-
即可解决。
实现过程中一定要注意代码正确,若是有问题先测试摄像头打开是否有问题或是版本问题,最简便打开摄像头的方法:命令cheese,如果没有安装,先使用 sudo apt-get install cheese 再用命令cheese打开。
实现结果如下:
最后实现人脸检测:
人脸识别技术是基于人的脸部特征,对输入的人脸图像或者视频流 . 首先判断其是否存在人脸 , 如果存在人脸,则进一步的给出每个脸的位置、大小和各个主要面部器官的位置信息。并依据这些信息,进一步提取每个人脸中所蕴涵的身份特征,并将其与已知的人脸进行对比,从而识别每个人脸的身份。
此处我进行的是人脸检测,即通过检测到的脸的位置、大小画出矩形框实现检测到人脸。
import cv2
import numpy as np
cv2.namedWindow("li") #命名一个窗口
cap = cv2.VideoCapture(0)#打开摄像头
success, frame = cap.read()#读取一桢图像,前一个返回值是否成功,后一个返回值是图
像本身
color = (0,225,0)#设置人脸框的颜色
classfier = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')#定义分类器
while success:
success, frame = cap.read()
size = frame.shape[:2]#获取当前桢彩色图像的大小
image = np.zeros(size,dtype = np.float16)#定义一个与当前桢图像大小相同的
灰度图像矩阵
image = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)#将当前桢图像转换成灰度图
像
cv2.equalizeHist(image,image)#灰度图像进行直方图等距化
#设定最小图像的大小
divisor = 8
h, w = size
minSize=(int(w/divisor),int(h/divisor))#这里加了一个取整函数
faceRects = classfier.detectMultiScale(image,1.2,2,cv2.CASCADE_SCALE_IMAGE,minSize)#人脸检测
if len(faceRects)>0:#人脸数组长度大于0
for faceRect in faceRects:#对每一个人脸画矩形框
x,y,w,h = faceRect
cv2.rectangle(frame,(x,y),(x+w,y+h),color)
cv2.imshow("li",frame)#显示图像
key = cv2.waitKey(10)
c = chr(key & 255)
if c in ['q','Q',chr(27)]:
break
cv2.destroyWindow("li")
代码是在网上看到一位老师写的,链接如下http://www.shtml.net/article/content/tok/99794/id/12919.html
其中我只做了微小的改动,打开摄像头这块参数是1还是0还是没搞明白,每次都是试出来的,一次跟一次不一样,知道原因的希望您在下方留言,让我这个小白多学点东西。
此处遇到类似问题empty() in function cv::CascadeClassifier::detectMultiScale,经过多次实验和查资料发现是
classfier = cv2.CascadeClassifier(‘haarcascade_frontalface_default.xml’)#定义分类器的问题,我将老师写的haarcascade_frontalface_alt.xml中的alt改为default,这两个分类器存在于我的文件夹opencv-2.4.13.6//data//haarcascades里面,但这个路径会报错,所以将要调用的.xml分类器复制粘贴到根目录下,最终完成人脸检测,关于框的颜色这里我就不说明了。
此处顺便说明一下key = cv2.waitKey(10)函数的用法,cv2.waitKey(int delay)函数的功能是不断刷新图像,delay为频率时间,单位为ms,返回值为当前键盘按键值,如果delay<=0,即等待时间无限长,返回值仍旧为键盘按键值,它本身是在一个给定时间内等待用户的按键触发。