项目简介

回头再看刚毕业时做的一些小项目,不禁感慨都是青春啊,咳咳,闲话少说,本项目是基于树莓派,使用opencv的简易人脸识别项目,没错就是简单,不过高大上的人脸识别,简易到什么地步呢,看下去就知道了。

图形处理基础知识

基本概念

1.opencv
opencv全称open source computer vision library,是一个轻量级的高效计算机视觉库,可以运行在linux,windows和mac os操作系统上,由一系列C函数和少量c++类构成,同时提供了python,ruby,matlab等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。opencv用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口。

2.V412摄像头
V4L2是linux系统下用于采集图片,视频和音频数据的API接口,配合适当的视频采集设备和相应的驱动程序,可以实现图片,视频,音频的采集。在远程会议,可视电话,视频监控系统中都有广泛的应用,在linux下,所有外设都被看做是一种特殊的文件,称为是设备文件,可以像访问普通文件一样对其进行读写。一般来说,采用V4L2驱动的摄像头设备文件是/dev/video0,设备节点可以理解为只要有设备节点,则设备成功连接,可以访问。

3.RGB
RGB色彩模式是工业界的一种颜色标准,是通过R,G,B三色通道的变化以及相互之间的叠加得到各种各式的颜色。RGB的多少是指亮度,并用整数表示,RGB各有256级亮度,0到255,由于可组合成2553种颜色,通常也被称为千万色或24位色(2的24次方)。RGB三色叠加,混合成色,但是混合后的亮度是三者亮度之和,0最弱,(0,0,0)是黑色,255最亮,(255,255,255)是白色。当三色灰度值相同时,产生不同灰度值的灰色调。对一种颜色进行编码的方法,统称为“颜色空间”或“色域”

4.灰度值
指黑白图像中的颜色深度,范围一般是0~255,白色为255,黑色为0,故黑白图片又称为灰度图像,在医学及图像识别领域有广泛的用途。

5.位图文件
又称光栅图,点阵图像,是使用像素阵列来表示的图像,每个像素的色彩信息由RGB组合或者灰度值表示。根据颜色信息所需的数据位分为1,4,8,16,24,32位等,位数越高,颜色越丰富,相应的数据量越大。

6.Alpha通道
在原有的图片编码方法基础上,增加像素的透明度信息

opencv图形处理函数及知识点补充

1.cv2.imread(参数1,参数2 )
读入图片命令,参数1是你要读入的图片,参数2是读取图像的颜色模式,cv2.IMREAD_COLOR读入彩色图像,cv2.IMREAD_GRAYSCALE读入灰度图像。

2.cv2.imshow(参数1,参数2)
显示图像命令,窗口会自动调整为图像大小,第一个参数是窗口的名字,其次是我们的图像

3.键盘绑定函数cv2.waitKey()
它的时间尺度是毫秒级,函数等待特定的几毫秒,看是否有键盘输入,特定几毫秒内,如果有任意键按下,函数会返回按键的ASCII码值。程序会继续运行,如果没有键盘输入,返回值为-1(上面是32位系统,64位命令是cv2.waitKey(0)&0xFF)

4.cv2.destroyAllWindows()
可以轻易删除任何我们建立的窗口
cv2.destroyWindows()
删除特定窗口,括号内为你想删除的窗口名
cv2.namedWindow()创建窗口
cv2.namedWindow(‘image’,cv2.WINDOW_AUTOSIZE)参数1是窗口名,参数2是初始设定函数标签
cv2.namedWindow(‘image’,cv2.WINDOW_NORMAL)
此时可以调整窗口大小,在图像维度太大或者需要添加轨迹条时,调整窗口大小将会很有用。

5.cv2.imwrite(‘messing.png’,img)
参数1是文件名,参数2是源文件

6.matplotlib是python的一个绘图库,里面有各种各样的绘图方法。

7 cap.read()
返回一个布尔值,如果帧读取的是正确的,就是True,所以你最后可以通过检查它的返回值来查看视频文件是否已经到了结尾。(有时cap不能成功的初始化设备,cap.isOpened()来检查)
cap.get(propId)来获得视频的一些参数信息,这里propId可以是0到18之间的任何整数,每一个数代表视频的一个属性,其中的一些值可以用cap.set(propId,value)来修改。

8.从文件中播放视频
与从摄像头中捕获一样,把设备索引号改成视频文件的名字即可。在播放每一帧时,使用cv2.waitKey()设置适当的持续时间,时间设置太短则播放快,设置太长则播放慢,通常25ms.

9.保存视频
(1)指定Fourcc编码,Fourcc是一个4字节码,用来确定视频的编码格式,Fourcc码是以下面的格式传给程序,以MJPG为例:
cv2.cv.FOURCC(‘M’,‘J’,‘P’,‘G’)或者
cv2.cv.FOURCC(*’MJPG’)
(2)创建videowriter的对象
out=cv2.videowriter(‘output.avi’,fourcc,20.0,(640,460))
参数1:输出文件名
参数2:编码格式
参数3:播放速率
参数4:帧大小

10.opencv中的绘图函数
所有绘图函数都需哟设置下面这些参数
img:你想要绘制图形的那副图像。
color:形状的颜色,以RGB为例,需要传入一个元组,例如(255,0,0)代表蓝色
thickness:线条的粗细,如果-1,则图形会被填充
linetype:线条类型,8连接,抗锯齿等,默认8连接,cv2.line_AA为抗锯齿
(1)画线:cv2.line()
要画一条线,只需要告诉函数,这条线的起点和终点。
(2)画矩形:cv2.rectangle()
需要知道矩形左上角顶点和右下角顶点的坐标
(3)画圆:cv2.circle()
需要指定图形的中心点坐标和半径大小

11.转换颜色空间(常用BGR转Gray和BGR转HSV)
函数cv2.cvtcolor(input_image,flag),其中参数flag是转换类型
BGR转Gray flag:cv2.COLOR_BGR2GRAY
BGR转HSV flag:cv2.COLOR_BGR2HSV
opencv的hsv格式中,H(色彩色度)取值范围[0,179],S(饱和度)取值范围[0,255],V(亮度)[0,255]。不同的软件使用的值可能不同,所以当你需要拿opencv的HSV值与其他软件HSV值比对时,一定记得归一化

12.CV2
CV2扩展库是针对opencv2.x API创建的,它直接采用Numpy的数组对象表示图像,因此和pyopencv相比,不再需要在数组和mat对象之间相互转换了。为了兼容opencv1.x API,在CV下提供了原来的opencv1.x API的扩展库。如果读者发现CV2下缺少某个功能,可以使用CV下提供的函数。CV2下的函数直接对Numpy数组进行操作,而CV则对两种表示对象的CVmat和iplimage对象进行操作。如果需要混用这两套API的函数,就需要在它们之间进行转换。

13.opencv读取视频,获得视频的格式,读取视频的每一帧,播放控制使用videocapture()和read()函数。opencv写视频,需要指定视频的格式,可以从全视频中获取,使用videowriter()和writer()函数。

14.面部检测
以Haar特征分类器为基础的图像检测技术是一种非常有效的对象检测技术,通过使用大量的正负样本训练得到一个cascade_function,最后再用它来做对象检测。
正样本图像指的是面部图像,负样本图像指的是不含面部的图像,opencv已经包含了很多已经训练好的分类器,包括:面部,眼睛,微笑等。这些XML文件保存在 cd ~/Downloads/opencv/data/haarcascades。

python-opencv环境的搭建

本项目python是2.7版本,opencv是3.0版本,环境搭建按下面步骤一步步来操作即可。(注意安装opencv时,网上有使用apt方式进行安装的,有采用源码方式安装的,前者安装比较便捷,但是我在安装的时候老是出现问题所以不得不放弃,源码方式安装需要在树莓派里面进行编译,比较费时间,基本上需要一天了,但是确实成功安装,本文档采用的是源代码方式进行安装的。)

opencv编译之前的准备工作

1.执行更新代码

 sudo apt-get update 
 sudo apt-get upgrade  
 sudo rpi-update 

2.安装从源码构建opencv的相关工具

sudo apt-get install build-essential git cmake pkg-config

3.加载不同格式图片的工具包(可能会提示tiff工具包安装错误,如果你不使用tiff格式的图片,这个错误可以忽略)

sudo apt-get install libjpeg8-dev libtiff4-dev libjasper-dev libpng12-dev

4.加载视频流所需要的IO包

sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev

5.按装GTK包,opencv加载图形窗口时使用

sudo apt-get install libgtk2.0-dev

6.安装下面的包可以在opencv里优化各种函数

sudo apt-get install libatlas-base-dev gfortran

7.以上属于准备工作,接下来从Github上把opencv的源码扒下来,克隆到你想放的目录下面,然后切换到新的版本3.0.0

cd ~/Downloads (这是我选的目录,你们可以自己选择放到其它目录)
git clone https://github.com/Itseez/opencv.git
cd opencv
git checkout 3.0.0

此外还要安装一个非常重要的库opencv_contrib

cd ~/Downloads 
git clone https://github.com/Itseez/opencv_contrib.git
cd opencv_contrib
git checkout 3.0.0

在python2.7+下编译opencv

1.也许你已经在之前安装过python2.X版本了,但是为了尽量避免出现不必要的问题,请在此步骤再装一遍。

sudo apt-get install python2.7-dev

2.安装与python2.7兼容的包管理工具pip

wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py

3.创建python虚拟环境(虚拟环境的作用是为了避免不同项目之间的干扰,具体可以百度)

sudo pip install virtualenv virtualenvwrapper
sudo rm -rf ~/.cache/pip

4.接下来设置环境变量,首先运行sudo nano ~/.profile打开该文件,如果不存在新建一个,然后把下面几句代码添加到文件末尾,保存退出。

#virtualenv and virtualenvwrapper
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python2.7
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh

5.通过下面两条命令创建CV工作需要的虚拟环境cv3(自己随意明名)

source ~/.profile
mkvirtualenv cv3

这里需要注意的是因为opencv是在cv3虚拟环境中编译,所以以后所有关于人脸识别的操作都需要在虚拟环境中进行,软件安装也必须在虚拟环境中安装。如果你以后想要进入虚拟环境,特别是重启机器时,可以通过下面两条命令进入:

source ~/.profile 
workon cv3

6.确保你的虚拟环境中安装了python库Numpy

pip install numpy
注意:整个安装过程非常的耗时间,所以可能在你安装过程中,树莓派关机或着退出了,所以在你继续安装时,切记切换到虚拟环境中继续。

7.通过cmake命令设置编译

cd ~/Downloads/opencv
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
 -D CMAKE_INSTALL_PREFIX=/usr/local \
 -D INSTALL_C_EXAMPLES=ON \
 -D INSTALL_PYTHON_EXAMPLES=ON \
 -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
 -D BUILD_EXAMPLES=ON ..

在这一步结束时,要注意package path的配置,这个文件夹是存放opencv3.0的链接及其编译,在界面里,我们可以看到opencv3.0链接存放在/usr/local/lib/python2.7/site-packages。
8.正式编译opencv3.0

make –j4  

#这里的4针对的是pi3上的4核,如果你的电脑是6核,就是-j6
注意:这一步是整个安装过程中最耗时间的一步,最少也要几个小时,如果安装过程中,树莓派卡住,重启后,进入虚拟环境,运行命令make –j4会继续安装的。
9.编译没有错误,通过下面两条命令安装

sudo make install
sudo ldconfig

现在opencv3.0已经成功地安装在你的机器上,运行命令

ls –l /usr/local/lib/python2.7/site-packages/

你应该看到cv2.so文件,这是真正的我们python需要的库,下面是把cv2.so链接到我们的虚拟环境cv3中去

cd ~/.virtualenvs/cv3/lib/python2.7/site-packages/
ln -s /usr/local/lib/python2.7/site-packages/cv2.so cv2.so

检查opencv3.0是否安装成功

1.进入虚拟环境

source ~/.profile
workon cv3

2.输入下列命令

python
import cv2
cv2.__version__

如果输出“3.0.0”,就ok了。

源代码

重点菜来了,文档再详细,没有源代码都是白扯,下面就贴上相关的源代码(新建py文件,代码复制进去,运行即可)

识别照片人脸

# -*- coding: utf-8 -*-

import numpy as np
import cv2
face_cascade = cv2. CascadeClassifier( 'haarcascade_frontalface_default.xml' )
eye_cascade = cv2. CascadeClassifier( 'haarcascade_eye.xml' )
img = cv2. imread( 'tian.jpg' )
gray = cv2. cvtColor(img, cv2. COLOR_BGR2GRAY)
#Detects objects of different sizes in the input image.
# The detected objects are returned as a list of rectangles.
#cv2.CascadeClassifier.detectMultiScale(image, scaleFactor, minNeighbors, flags, minSize, maxSize)
#scaleFactor – Parameter specifying how much the image size is reduced at each image
#scale.
#minNeighbors – Parameter specifying how many neighbors each candidate rectangle should
#have to retain it.
#minSize – Minimum possible object size. Objects smaller than that are ignored.
#maxSize – Maximum possible object size. Objects larger than that are ignored.
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
	img = cv2. rectangle(img,(x,y),(x+w,y+h),( 255, 0, 0), 2)
	roi_gray = gray[y:y+h, x:x+w]
	roi_color = img[y:y+h, x:x+w]
	eyes = eye_cascade. detectMultiScale(roi_gray)
	for (ex,ey,ew,eh) in eyes:
		cv2. rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),( 0, 255, 0), 2)
cv2. namedWindow( 'img' , cv2. WINDOW_NORMAL)
cv2. imshow( 'img' ,img)
cv2. waitKey( 0)
cv2. destroyAllWindows()

识别视频中人脸

# -*- coding: utf-8 -*-

import numpy as np
import cv2
cap = cv2. VideoCapture(0)
while( True):
	# Capture frame-by-frame
	ret, frame = cap. read()
	# Our operations on the frame come here
	gray = cv2. cvtColor(frame, cv2. COLOR_BGR2GRAY)
	# Display the resulting frame
	cv2. imshow( 'frame' ,gray)
	if cv2. waitKey( 1) & 0xFF == ord( 'q' ):
		break
 # When everything done, release the capture
 cap. release()
 cv2. destroyAllWindows()

总结

各位同学现在知道本项目为啥叫简易人脸识别了吧,人脸识别领域博大精深,有兴趣有时间的小伙伴可以慢慢研究哦。

Logo

更多推荐