树莓派无法识别摄像头+树莓派中opencv调用视频流人脸检测

项目场景:

1、需要使用树莓派的CSI摄像头;或者motion在网页中使用摄像头;但是我之前开启的motion 的开启自启动
2、在opencv中需要调用树莓派的摄像头使用;进行人脸识别等一系列的操作;


第一步

开启使用权限

树莓派无法识别摄像头+树莓派中opencv调用视频流人脸检测_第1张图片

树莓派检测不到摄像头,树莓派摄像头运行

*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

树莓派无法识别摄像头+树莓派中opencv调用视频流人脸检测_第2张图片
系统重启后就会加载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

树莓派无法识别摄像头+树莓派中opencv调用视频流人脸检测_第3张图片
树莓派无法识别摄像头+树莓派中opencv调用视频流人脸检测_第4张图片

这样就可以了

第四步、

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()  # 释放资源

这样就能简单的读取摄像头和人脸检测的信息了

你可能感兴趣的:(opencv,计算机视觉,python)