本人博客:https://tiiiktak.github.io
注意:树莓派插电时千万不要插拔摄像头!据说十有八九摄像头会GG,我差点就中招了
安装驱动
首先使用ls指令查看是否加载到了对应的video device设备:
ls -al /etc
没有看到设备开始安装驱动
添加驱动设备到文件夹
sudo vim /etc/modules
在文件末尾添加
bcm2835-v412
修改raspberry的启动配置
进入管理中心开启pi camera
sudo raspi-config
选择interfacing option
开启Camera后重启
检查/dev
ls -al /dev/ | grep video
有video设备则成功
使用树莓派摄像头
使用raspistill指令
测试
raspistill -o image.jpg
在使用hdml线连接lcd屏和树莓派时运行,显示屏会显示几秒钟摄像头的实时画面,但使用VNC连接时并不会有实时画面
raspistill相关
- -v:查看调试信息
- -w:图像宽度
- -h:图像高度
- -rot:图像旋转角度,仅支持0,90,180,270度
- -o:图像输出地址,若文件名为’-’,将输出发送至标准输出设备
- -t:获取图像前等待时间,默认为5000,即5秒
- -tl:多久执行一次图像抓取
生成.h246文件
raspistill -o mykeychain.h264 -t 10000 -w 1280 -h 720
错误
在第一次成功调用后,之后再次调用时多次报错:
mmal: No data received from sensor. Check all connections, including the Sunny one on the camera board
网上说导致该问题的原因有:
- 摄像头sunny部分是否连接牢靠
- 摄像头是否插紧
- 最可能:在树莓派带电的时候插拔摄像头,导致管脚烧坏了。这个时候就需要找到是哪个管脚烧坏了,然后补焊一下,加点阻焊剂;
最开始不知道不能热插拔,带点插拔了两三次,不过幸好后面关机重新插了之后就正常了,差点就是血的教训了
VLC实现http视频流传输
在树莓派输入如下命令
sudo raspivid -o - -t 0 -w 640 -h 360 -fps 25|cvlc -vvv stream:///dev/stdin --sout '#standard{access=http,mux=ts,dst=:8090}' :demux=h264
意思:使用PI官方的raspivid捕获视频工具把视频流输出到vlc,通过vlc转码成h264网络视频流通过http协议以ts的形式封装,然后输出到8090端口,用这个当监控只要网络稳定绝对不卡。
之后使用VLC客户端,网络串流:http://树莓派ip:8090
即可,不过延迟较高,可能是因为我用的手机热点的原因,之后再试。
opencv调用树莓派摄像头
配置好opencv后,就能使用opencv自带的videocapture调用摄像头
C++调用
参考这里,成功调用
代码:
void OpenCamera()
{
//打开摄像头
VideoCapture capture;
capture.open(0);
//灰度图像
Mat edge;
//循环显示每一帧
while (1)
{
//frame存储每一帧图像
Mat frame;
//读取当前帧
capture >> frame;
//显示当前视频
imshow("正在录制", frame);
//得到灰度图像
cvtColor(frame, edge, CV_BGR2GRAY);
//3*3降噪 (2*3+1)
blur(edge, edge,Size(7,7));
//边缘显示
Canny(edge,edge,0,30,3);
imshow("高斯模糊视频",edge);
}
}
使用VNC连接时延迟较高,在使用HDMI显示屏时效果较好,延迟较低
VNC连接:
HDMI连接:
Python调用
参考官网指南