参考子豪兄教你在树莓派上安装OpenCV
启动后,打开桌面 配置一下用户和密码,首选项-> Configration,配置自动登录。
参考 配置好pi
参考sources.list 详解
清华: http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/
浙大:http://mirrors.zju.edu.cn/raspbian/raspbian/
科大:http://mirrors.ustc.edu.cn/raspbian/raspbian/
在树莓派的命令行界面输入
sudo nano /etc/apt/sources.list
使用键盘方向键控制,在第一行开头加一个#,把下面的内容拷贝到最后一行之后,如图中的效果:
deb http://mirrors.ustc.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi
deb-src http://mirrors.ustc.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi
先按键盘上的ctrl+o,再按回车保存,再按ctrl+x退出nano编辑器回到命令行界面。再输入以下命令更新到清华大学镜像源最新的软件列表。
sudo apt-get update
这个命令,会访问源列表里的每个网址,并读取软件列表,然后保存在树莓派本地。
给Python的第三方模块安装工具pip换源
方法一:输入命令
清华大学开源软件镜像站官方推荐方法,但该方法在树莓派上可能会失效。
只需树莓派命令行中输入下面这一行命令,即可永久设置pip下载源为国内源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
注意:是 https 而不是 http,simple 不能少
在树莓派的命令行中依次输入运行以下三个命令
sudo mkdir ~/.pip
cd .pip
sudo nano pip.conf
在打开的文件中输入以下内容:
[global]
timeout = 10
index-url = http://mirrors.aliyun.com/pypi/simple/
extra-index-url= http://pypi.douban.com/simple/
[install]
trusted-host=
mirrors.aliyun.com
pypi.douban.com
还可以参考:Python开发快速安装第三方包(pip换源)
升级所有安装的软件
运行下面这行命令,会把本地已安装的软件,与刚下载的软件列表里对应软件进行对比,如果发现已安装的软件版本太低,就会提示你更新。执行这行命令可能需要很长时间。
sudo apt-get upgrade
运行了sudo apt-get update命令,现在运行sudo apt-get upgrade命令,有什么不同呢?
答:update仅仅是从下载源获取并更新可下载软件列表,相当于更新索引地图。而upgrade是更新软件本身。后者要花费多得多的时间。
更新完成后,有几个包无法更新,用命令补充
apt-get update --fix-missing
source.list 文件版本说明
wheezy(更老的稳定版)
jessiels(老的稳定版)
stretch(稳定版)
buster(测试版)
sudo apt-get install fonts-wqy-zenhei
sudo apt-get install fcitx fcitx-googlepinyin fcitx-module-cloudpinyin fcitx-sunpinyin
安装成功之后,会在下一次重启时生效。可以使用ctrl+空格切换为中文输入法。
依次执行下列五条命令。在运行第二条命令的时候会显示很多依赖包没有安装,第三条命令就是用来安装这些依赖包。
wget http://download.teamviewer.com/download/linux/version_11x/teamviewer-host_armhf.deb
sudo dpkg -i teamviewer-host_armhf.deb
sudo apt-get -f install
sudo apt-get install gdebi
sudo gdebi teamviewer-host_armhf.deb
teamviewer info可以查看teamviewer当前版本
在跳出的对话框选择Accept License Agreement 在树莓派桌面,右上角可以看到teamviewer的图标了,点击进入。再点击Grant easy access,登录你的teamviewer账户,设置连接密码。通过那一串数字(如图中的1112747434),就可以让全世界任意一台上网的电脑或手机远程桌面操控你的树莓派了。
参考树莓派4B配置摄像头并实现实时人脸检测
打开树莓派命令行界面输入命令,进入树莓派配置界面。打开camera。
sudo raspi-config
将摄像头的USB口连接到树莓派的任意一个USB口后再开机。一定要先接摄像头再开机,不然树莓派可能无法识别。
输入输入lsusb或者ls /dev/video*命令。
安装mplayer播放器
sudo apt-get install mplayer -y
sudo apt-get install fswebcam -y
sudo mplayer tv://
确认画面之后需要通过ctrl+c退出,才能进行下一步调用摄像头操作.否则会报如摄像头忙碌的错误。
fswebcam -d /dev/video0 --no-banner -r 320x240 -S 10 /home/pi/image.jpg
其中:
export DISPLAY=:0.0
sudo apt-get install python-opencv
下载网络和权重文件 没有用
wget --no-check-certificate https://download.01.org/opencv/2019/open_model_zoo/R1/models_bin/face-detection-adas-0001/FP16/face-detection-adas-0001.bin
wget --no-check-certificate https://download.01.org/opencv/2019/open_model_zoo/R1/models_bin/face-detection-adas-0001/FP16/face-detection-adas-0001.xml
新建face-detection-camera.py文件,并写入以下内容:
# coding=utf-8
# face-detection-camera.py
import cv2 as cv
import numpy as np
print('开始人脸摄像头实时检测')
# 载入模型文件和权重文件
net = cv.dnn.readNet('face-detection-adas-0001.xml','face-detection-adas-0001.bin')
# Specify target device
net.setPreferableTarget(cv.dnn.DNN_TARGET_MYRIAD)
# 从摄像头中读取图像帧
cap=cv.VideoCapture(0)
while(1):
# 获取一帧图像
ret,frame=cap.read()
# Prepare input blob and perform an inference
frame=cv.resize(frame,(480,320),interpolation=cv.INTER_CUBIC)
blob=cv.dnn.blobFromImage(frame,size=(672,384),ddepth=cv.CV_8U)
net.setInput(blob)
out=net.forward()
# 绘制人脸框
for detection in out.reshape(-1,7):
confidence=float(detection[2])
# 获取左上角图片坐标
xmin=int(detection[3]*frame.shape[1])
ymin=int(detection[4]*frame.shape[0])
# 获取右下角图片坐标
xmax=int(detection[5]*frame.shape[1])
ymax=int(detection[6]*frame.shape[0])
if confidence > 0.5:
cv.rectangle(frame,(xmin,ymin),(xmax,ymax),color=(0,255,0))
# 展示图像
cv.imshow('capture',frame)
if cv.waitKey(1)&0xFF==ord('q'):
# 每1秒监听一次键盘的动作,按q键结束,并保存图片
cv.imwrite('out.png',frame)
print('save one image done!')
break
# 关闭摄像头及显示窗口
cap.release()
cv.destroyAllWindows()
print('人脸摄像头实时检测完成')
python3 face-detection-camera.py
可以左右移动人脸查看识别情况,界面上会在检测到的人脸画一个绿色的框
按键盘Q键可退出检测,并保存最后一帧图像.
这部分未成功
树莓派安装opencv调用cv2时提示 ModuleNotFoundError: NO module named 'cv2’的解决方法
sudo pip3 install opencv-python
sudo apt-get install libjpeg-dev libatlas-base-dev libjpeg-dev libtiff5-dev libpng12-dev libqtgui4 libqt4-test libjasper-dev
-
sudo pip3 install numpy
sudo pip3 install opencv-python
不成功, 要单独下载 , opencv下载地址
然后上传到树莓派,使用以下命令安装:
sudo pip3 install opencv_python-4.4.0.46-cp37-cp37m-linux_armv7l.whl
pip install pip -U
pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
python3
import cv2
cv2.__version__
用树莓派自带的IDE运行下列代码。
打开一个图片(将图片yangmi.jpg放到 py 程序同级目录下)并显示 , 01tespopencv.py源码,:
import cv2
img = cv2.imread("yangmi.jpg") # load image
cv2.imshow("image", img) # show image
cv2.waitKey(0) # wait until key pressed
参考用树莓派3B+和Python+OpenCV实现实时的人脸检测
用树莓派自带的IDE运行下列代码,可捕捉PiCam生成的用RGB颜色和灰色模式展示的视频流。按ESC退出运行测试窗口。
02testcv2camera.py源码 :
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
cap.set(3,640) # set Width
cap.set(4,480) # set Height
while(True):
ret, frame = cap.read()
frame = cv2.flip(frame, -1) # Flip camera vertically
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame', frame)
cv2.imshow('gray', gray)
k = cv2.waitKey(30) & 0xff
if k == 27: # press 'ESC' to quit
break
cap.release()
cv2.destroyAllWindows()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2DheTg7J-1605571109371)(figs/5.1摄像头模组opencv_test.png)]
如果通过特征的方式,那就绕不开Haar特征分类器。
Haar-like特征最早是由Papageorgiou等人用于物体检测的数字图像特征,而Viola和Jones在此基础上,使用3种类型4种形式的特征。
Haar特征分为三类:边缘特征、线性特征、中心特征和对角线特征,组合成特征模板。特征模板内有白色和黑色两种矩形,并定义该模板的特征值为白色矩形像素和减去黑色矩形像素和。Haar特征值反映了图像的灰度变化情况。例如:脸部的一些特征能由矩形特征简单的描述,如:眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等。但矩形特征只对一些简单的图形结构,如边缘、线段较敏感,所以只能描述特定走向(水平、垂直、对角)的结构。
这类矩形特征模板由两个或多个全等的黑白矩形相邻组合而成,而矩形特征值是白色矩形的灰度值的和减去黑色矩形的灰度值的和,矩形特征对一些简单的图形结构,如线段、边缘比较敏感。如果把这样的矩形放在一个非人脸区域,那么计算出的特征值应该和人脸特征值不一样,所以这些矩形就是为了把人脸特征量化,以区分人脸和非人脸。
如果自己找人脸训练特征的话,需要花费时间和大量的素材,那今天就采用OpenCV官方给出的训练结果!
参考十行Python代码实现人脸识别
/usr/local/lib/python3.7/dist-packages/cv2/data
人脸图片(将图片yangmi.jpg放到 py 程序同级目录下)识别 ,人脸识别 03face-detection-pic.py 源码:
# 十行代码完成人脸识别
# bilibili:同济子豪兄
# 20190516
import cv2
img = cv2.imread('yangmi.jpg',1)
face_engine = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml')
faces = face_engine.detectMultiScale(img,scaleFactor=1.3,minNeighbors=5)
for (x,y,w,h) in faces:
img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
cv2.imshow('yangmi.jpg',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 十行代码完成人脸识别-注释版
# bilibili:同济子豪兄
# 20190516
# 导入opencv-python
import cv2
# 读入一张图片,引号里为图片的路径,需要你自己手动设置
img = cv2.imread('yangmi.jpg',1)
# 导入人脸级联分类器引擎,'.xml'文件里包含训练出来的人脸特征
face_engine = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml')
# 用人脸级联分类器引擎进行人脸识别,返回的faces为人脸坐标列表,1.3是放大比例,5是重复识别次数
faces = face_engine.detectMultiScale(img,scaleFactor=1.3,minNeighbors=5)
# 对每一张脸,进行如下操作
for (x,y,w,h) in faces:
# 画出人脸框,蓝色(BGR色彩体系),画笔宽度为2
img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
# 在"img2"窗口中展示效果图
cv2.imshow('img2',img)
# 监听键盘上任何按键,如有按键即退出并关闭窗口,并将图片保存为output.jpg
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('output.jpg',img)
人脸图片(将图片yangmi.jpg放到 py 程序同级目录下)识别 ,对单个图片进行人脸识别和人眼检测 04faceeye-detection-pic.py 源码:
# 单张图片人脸+眼睛识别
# bilibili视频教程:同济子豪兄
# 2019-5-16
#导入opencv
import cv2
# 导入人脸级联分类器引擎,'.xml'文件里包含训练出来的人脸特征,cv2.data.haarcascades即为存放所有级联分类器模型文件的目录
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml')
# 导入人眼级联分类器引擎吗,'.xml'文件里包含训练出来的人眼特征
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_eye.xml')
# 读入一张图片,引号里为图片的路径,需要你自己手动设置
img = cv2.imread('image3.png')
# 用人脸级联分类器引擎进行人脸识别,返回的faces为人脸坐标列表,1.3是放大比例,5是重复识别次数
faces = face_cascade.detectMultiScale(img, 1.3, 5)
# 对每一张脸,进行如下操作
for (x,y,w,h) in faces:
# 画出人脸框,蓝色(BGR色彩体系),画笔宽度为2
img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
# 框选出人脸区域,在人脸区域而不是全图中进行人眼检测,节省计算资源
face_area = img[y:y+h, x:x+w]
eyes = eye_cascade.detectMultiScale(face_area)
# 用人眼级联分类器引擎在人脸区域进行人眼识别,返回的eyes为眼睛坐标列表
for (ex,ey,ew,eh) in eyes:
#画出人眼框,绿色,画笔宽度为1
cv2.rectangle(face_area,(ex,ey),(ex+ew,ey+eh),(0,255,0),1)
# 在"img2"窗口中展示效果图
cv2.imshow('img2',img)
# 监听键盘上任何按键,如有案件即退出并关闭窗口,并将图片保存为output.jpg
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('output.jpg',img)
开启摄像头 进行人脸识别和人眼检测 05faceeye-detection-camera.py 源码:
# 调用电脑摄像头进行实时人脸+眼睛识别,可直接复制粘贴运行
# bilibili视频教程:同济子豪兄
# 2019-5-16
import cv2
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_eye.xml')
# 调用摄像头摄像头
cap = cv2.VideoCapture(0)
while(True):
# 获取摄像头拍摄到的画面
ret, frame = cap.read()
faces = face_cascade.detectMultiScale(frame, 1.3, 5)
img = frame
for (x,y,w,h) in faces:
# 画出人脸框,蓝色,画笔宽度微
img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
# 框选出人脸区域,在人脸区域而不是全图中进行人眼检测,节省计算资源
face_area = img[y:y+h, x:x+w]
eyes = eye_cascade.detectMultiScale(face_area)
# 用人眼级联分类器引擎在人脸区域进行人眼识别,返回的eyes为眼睛坐标列表
for (ex,ey,ew,eh) in eyes:
#画出人眼框,绿色,画笔宽度为1
cv2.rectangle(face_area,(ex,ey),(ex+ew,ey+eh),(0,255,0),1)
# 实时展示效果画面
cv2.imshow('frame2',img)
# 每5毫秒监听一次键盘动作
if cv2.waitKey(5) & 0xFF == ord('q'):
break
# 最后,关闭所有窗口
cap.release()
cv2.destroyAllWindows()
开启摄像头 进行人脸识别 人眼 笑脸 06faceeyesmele-detection-camera.py 源码:
# 调用电脑摄像头进行实时人脸+眼睛+微笑识别,可直接复制粘贴运行
# bilibili视频教程:同济子豪兄
# 2019-5-16
import cv2
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_eye.xml')
smile_cascade = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_smile.xml')
# 调用摄像头摄像头
cap = cv2.VideoCapture(0)
while(True):
# 获取摄像头拍摄到的画面
ret, frame = cap.read()
faces = face_cascade.detectMultiScale(frame, 1.3, 2)
img = frame
for (x,y,w,h) in faces:
# 画出人脸框,蓝色,画笔宽度微
img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
# 框选出人脸区域,在人脸区域而不是全图中进行人眼检测,节省计算资源
face_area = img[y:y+h, x:x+w]
## 人眼检测
# 用人眼级联分类器引擎在人脸区域进行人眼识别,返回的eyes为眼睛坐标列表
eyes = eye_cascade.detectMultiScale(face_area,1.3,10)
for (ex,ey,ew,eh) in eyes:
#画出人眼框,绿色,画笔宽度为1
cv2.rectangle(face_area,(ex,ey),(ex+ew,ey+eh),(0,255,0),1)
## 微笑检测
# 用微笑级联分类器引擎在人脸区域进行人眼识别,返回的eyes为眼睛坐标列表
smiles = smile_cascade.detectMultiScale(face_area,scaleFactor= 1.16,minNeighbors=65,minSize=(25, 25),flags=cv2.CASCADE_SCALE_IMAGE)
for (ex,ey,ew,eh) in smiles:
#画出微笑框,红色(BGR色彩体系),画笔宽度为1
cv2.rectangle(face_area,(ex,ey),(ex+ew,ey+eh),(0,0,255),1)
cv2.putText(img,'Smile',(x,y-7), 3, 1.2, (0, 0, 255), 2, cv2.LINE_AA)
# 实时展示效果画面
cv2.imshow('frame2',img)
# 每5毫秒监听一次键盘动作
if cv2.waitKey(5) & 0xFF == ord('q'):
break
# 最后,关闭所有窗口
cap.release()
cv2.destroyAllWindows()
不管是检测人脸还是检测笑脸,都会用到 detectMultiScale() 函数进行标记
此函数的作用是,在输入图像中检测不同尺寸的对象,返回包含对象的矩形框。
image——输入图像
scaleFactor——表示每轮检测图像齿轮减少的比例
minNeighbors——指明对象要至少被检测到几次才能判定对象确实存在
minSize——检测对象的最小尺寸
maxSize——检测对象的最大尺寸
局限性:
参考文献:
Face Detection using Haar Cascades
使用Haar Cascade 进行人脸识别
Github开源人脸识别项目face_recognition
树莓派4B开机配置指南_利用官方模型实现人脸识别
基于OpenCV的人脸及笑脸检测
Python实现人脸识别图片+视频