前面讲述的部分已经实现了语音交互功能,而我的毕设增加了人脸检测,检测到人脸才开始进行语音交互,人脸检测的方法利用的是基于Haar特征的级联分类器检测。采用OpenCV实现。
OpenCV的安装过程:https://blog.csdn.net/weixin_43850620/article/details/104533026
下面直接上源码分析吧
import numpy as np
import cv2
import os
import time
# 这里选择级联分类器,根据自己的分类器位置进行调整
faceCascade = cv2.CascadeClassifier('./haarcascades/haarcascade_frontalface_alt2.xml')
color = (0, 255, 0) #人脸框颜色
def face():
num = 0
cap = cv2.VideoCapture(0)
print("----开始检测人脸------")
while True:
ret, img = cap.read()
if not ret:
continue
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = faceCascade.detectMultiScale(
gray,
scaleFactor=1.2,
minNeighbors=3,
minSize=(32, 32)
)
if len(faces) > 0: #大于0则检测到人脸
print("num:",num)
if num == 0:
time1 = time.time()
num = num + 1
for faceRect in faces: #单独框出每一张人脸
x, y, w, h = faceRect
cv2.rectangle(img, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 2)
time2 = time.time()
if time2 < time1 + 3:
if num > 4:
break
else:
num = 0
# cv2.imshow('video',img)
if cv2.waitKey(3) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
os.system("mplayer begin.mp3")
程序大概过程是:从摄像头中获取一张图像,放到级联分类器中检测人脸,如果检测到人脸,faces变量的值是大于0的。后面的程序我是想持续检测3s到人脸才判断是真的人脸,然后跳出循环结束人脸检测。这样做的目的是想减少误识别。
我的总代码整理好后会放到github上,链接:
最后做的实物视频:https://b23.tv/BV19t4y117Q1
------------------------------分割线-----------------------------------
这其中瞎折腾很多问题,现在才写这篇博客,大多问题都忘记,就写几个感触深的点吧
1、软件源问题,切换成国内源软件源地址不对的话,有些软件是apt-get下载不了的,之前乱删了一些东西,又瞎跟着网上的各种版本换源,最后树莓派VNC登录进去,界面很多东西都没了。
如果你要下载的软件apt-get没有,可以上国内源的网站上逛逛,看看有没有安装包,找最新的版本下载下来在上传到树莓派上用命令行安装,跟着网上用网络从网站下载的一般不是最新版本,例如raspi-config,我就试过古老的版本。
后续更新。。。。。。
-----------------------------下面放一大堆大佬的链接-----------------------
谢谢这些大佬!!!
参考链接:
OpenCV github开源库
摄像头基础
opencv实现人脸检测
https://www.cnblogs.com/cslunatic/p/3227655.html
asoundrc配置文件简单介绍
树莓派终端常用操作及常用目录
树莓派3b与电脑串口互相通信进行数据传输
树莓派安装图形化界面(PIXEL)
官方pyaudio文档介绍
树莓派配置麦克风录音
Raspbian解决安装依赖问题
树莓派安装软件解决依赖办法
树莓派下pyaudio安装与声音
解决采样率16K错误
树莓派音频播放测试
树莓派上安装中文字体和拼音输入
树莓派连接WIFI