树莓派遇上Java 05:摄像头篇

本文时间久远,部分内容可能过时,仅供参考。

制作遥控小车都会希望它能实时传输画面到控制器,而且为获得更大灵活性,一般将摄像头固定在由舵机控制的两自由度云台上,使之可以横向竖向旋转来拍摄各个方向的画面。

树莓派支持两种类型的摄像头,一种是普通USB摄像头,一种是专用的Pi Cam,都可以在淘宝上找到。后者某些型号还具有红外夜视能力,价格也会高一些。

这里以树莓派专用的Pi Cam为例,介绍摄像头的基本使用方法。

树莓派 RaspberryPi 摄像头 Camera

Pi Cam接在树莓派中部的CSI接口上,不需要额外供电。如在马达篇提过的,建议为树莓派使用独立电源通过USB口供电而不要从驱动马达的L298N取电,否则在摄像头开启的瞬间树莓派可能会因为电压不稳而重启。

这个项目只是玩具,使用一种简单传输图像的方法,由MJPG-Streamer调用摄像头拍摄画面并将画面发送到指定端口上,同一局域网中的浏览器访问树莓派IP:端口即可显示实时画面。

首先在设置中开启摄像头:

sudo raspi-config

简单的拍照命令:

# 拍照并将照片旋转180度
raspistill -o image.jpg -rot 180

安装MJPG-Streamer依赖库:

sudo apt install libjpeg8-dev cmake

下载MJPG-Streamer并解压:

unzip mjpg-streamer-master.zip

切换到解压后的路径下编译安装:

cd  ~/mjpg-streamer-master/mjpg-streamer-experimental
make
sudo make install

MJPG-Streamer加入环境变量,一般是编辑/etc/profile,在文件底部添加其路径:

export LD_LIBRARY_PATH=/opt/mjpg-streamer-master/mjpg-streamer-experimental/

启动摄像,图像旋转180度,分辨率为320x240,30FPS,输出到8080端口:

# 如果是USB摄像头,将input_raspicam.so改为input_uvc.so
mjpg_streamer -i "input_raspicam.so  -rot 180 -x 320 -y 240 -fps 30" -o "output_http.so –p 8080 -w /usr/local/www"

在浏览器中输入以下地址查看传输的图像:

# 静态图片
http://树莓派IP:8080/?action=snapshot
# 动态图像
http://树莓派IP:8080/?action=stream
# 动态图像
http://树莓派IP:8080/javascript_simple.html

以上就是树莓派摄像头的基本操作方法,Android控制端可以用内嵌WebView接受图像,同时监听触控事件,手指滑动时控制云台旋转让摄像头随之指向对应角度,是非常好的操控体验。

那么当摄像头正在工作时如何远程关掉它呢?比如MJPG-Streamer正在传输视频,现在需要调用摄像头拍照,就必须先使占用摄像头的程序停止工作才能调用它做另外的事,可以使用Linux命令配合进程名终结MJPG-Streamer进程。

# 列出所有运行的进程,找到所需的进程名
ps -eo pid,comm,cmd

根据进程名终结指定的进程:

killall 进程名

摄像头传输的视频质量需要结合实际的网络状况定义,搭配相应的FPS和分辨率使画面流畅显示。若网络不佳出现断流,刷新浏览器即可。

arrow_upward