1、需要使用树莓派的CSI摄像头;或者motion在网页中使用摄像头;但是我之前开启的motion 的开启自启动
2、在opencv中需要调用树莓派的摄像头使用;进行人脸识别等一系列的操作;
树莓派检测不到摄像头,树莓派摄像头运行
*vcgencmd get_camera*
命令显示supported=0 detected=0或者是找不到video 0
编辑/boot/config.txt这个文件,
sudo nano /boot/config.txt
,找到gpu_men,改成了256,然后+一条start_x=1 ;在256下面;然后重启树莓派,就会发现,完美解决了。具体为什么这样我也没太明白
*vcgencmd get_camera*
在运行就显示检测到摄像头了
在opencv中一直会报错没有摄像头index错误;猜测应该是参数或者是驱动不对;于是进去/etc/modules中配置了驱动;让设备能够去识别找个相机
sudo nano /etc/modules
进去之后加上这样一条命令就行
在结尾处
bcm2835-v4l2
系统重启后就会加载bcm2835-v4l2模块,opencv便能加载出csi相机。
运行下面这条命令
sudo raspistill -o 文件名.jpg
但是会报错;这里的原因是我之前设置了motion开机自启动的原因;所以需要先把motion进程给关掉;然后再去把自启动改掉;
sudo killall -TERM motion
这样就停止了motion进程了
sudo raspistill -o 123.jpg
再去执行拍照命令就OK了;
然后为了后面motion不开机自启动;可以去把它的默认修改掉
sudo nano /etc/default/motion
这样就可以了
import cv2
# 导入人脸级联分类器,'.xml'文件里包含训练出来的人脸特征
face_engine = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')
# 导入人眼级联分类器,'.xml'文件里包含训练出来的人眼特征
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
# 调用摄像头摄像头;这里索引是0的原因是添加过驱动了 ;会去读取/ect中的驱动
cap = cv2.VideoCapture(0)
while (True):
# 获取摄像头拍摄到的画面
# 会得到两个参数,一个是否捕捉到图像(True/False),另一个为存放每帧的图像
ret, frame = cap.read() # 读取一帧图像
# 每帧图像放大1.1倍,重复检测10次
faces = face_engine.detectMultiScale(frame, 1.1, 10) # 得到人脸,可能不止一个
img = frame # 复制
print(img)
for (x, y, w, h) in faces:
# 画出人脸框,蓝色,画笔宽度为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, 1.1, 5)
# 用人眼级联分类器在人脸区域进行人眼识别,返回的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(''frame'', img)
cv2.imshow('frame', img)
# 每5毫秒监听一次键盘动作
if cv2.waitKey(5) & 0xFF == ord('q'): # 当按下“q”键时退出人脸检测
break
# 最后,关闭所有窗口
cap.release()
cv2.destroyAllWindows() # 释放资源
这样就能简单的读取摄像头和人脸检测的信息了