一、开源的视频图像处理库概述
在嵌入式系统领域,存在多种用于视频图像处理的开源库,其中包括:luvcview、cheese、motion、mjpg-streamer以及ffmpeg等:
• luvcview:这是一个基于V4L2和SDL的工具,特点包括支持拍照和录像功能,可调节各种参数, 其代码简洁并且实用,非常适合用于学习V4L2编程。
• cheese:这一程序同样基于V4L2和GTK,支持视频录制和拍摄功能,并能添加特殊的视频效果。
• motion:这是一个专门用于移动侦测的拍照应用程序。
• mjpg-streamer:此程序用于网络摄像机的视频传输。
二、mjpg-streamer详解
mjpg-streamer是一个突出的开源项目,它允许用户通过HTTP协议远程访问Linux环境下的兼容摄像头,实现远程视频传输。
该软件从网络摄像头中获取图像,并将图像以流媒体形式通过IP网络传输给各种客户端,如Firefox浏览器、Cambozola、VLC播放器,以及Windows和其他设备上的移动浏览器。
此外,mjpg-streamer能够利用部分网络摄像头的硬件压缩功能,显著降低服务器的CPU负载。
因此,它为嵌入式设备及常规服务器提供了一个轻量级且CPU消耗低的解决方案,避免了因视频帧压缩导致的计算资源大量消耗。
三、测试摄像头
1)按上图的方式将罗技摄像头连接入虚拟机
2)下载安装cheese 检测摄像头是否能够正常工作
$ sudo apt-get update
$ sudo apt-get install cheese
ubuntu 16.04已经自带该程序
3)测试
摄像头连接后会生成以下设备文件
root@ubuntu:/home/peng/work# ls /dev/video0 -l
crw-rw----+ 1 root video 81, 0 Mar 25 07:18 /dev/video0
运行
root@ubuntu:/home/peng/work# cheese
四、移植
安装准备:
1. 安装前准备
sudo apt-get install libsdl1.2-dev subversion
sudo apt-get install libjpeg62-dev
sudo apt-get install imagemagick
2. 下载mjpeg-streamer
git clone https://github.com/shrkey/mjpg-streamer
如果没有安装git,执行以下命令
sudo apt-get install git
3. 编译安装
cd mjpg-streamer/mjpg-streamer
root@ubuntu:/home/peng/work/camera/mjpg-streamer# tree -L 1 ./
./
├── doc
├── mjpeg-client #分别有 linux和windows 的客户端
├── mjpg-streamer #目录下提供了 的执行程序和各个输入输出设备组件
├── mjpg-streamer-experimental
├── mjpg-streamer.tar.gz
├── README.md
├── udp_client
└── uvc-streamer #目录下提供了 uvc-streamer的可执行目录
6 directories, 2 files
ps:重新编译前,需要执行
make
sudo make install
root@ubuntu:/home/peng/work/camera/mjpg-streamer/mjpg-streamer# make install
install --mode=755 mjpg_streamer /usr/local/bin
install --mode=644 input_uvc.so output_file.so output_udp.so output_http.so input_testpicture.so input_file.so /usr/local/lib/
install --mode=755 -d /usr/local/www
install --mode=644 -D www/* /usr/local/www
编译生成的库文件功能
(1)input_testpicture.so。这是一个图像测试插件,它将预设好的图像编译成一个头文件,可以在没有摄像头的情况下传输图像,从而方便调试程序。
(2)input_uvc.so。此文件调用USB摄像头驱动程序V4L2,从摄像头读取视频数据。
(3)input_control.so。这个文件实现对摄像头转动的控制接口。
(4)output_http.so。这是一个功能齐全的网站服务器,它不仅可以从单一文件夹中处理文件,还可以执行一定的命令,它可以从输入插件中处理一幅图像,也可以将输入插件的视频文件根据现有M-JPEG标准以HTTP视频数据服务流形式输出。
(5)output_file.so。这个插件的功能是将输入插件的JPEG图像存储到特定的文件夹下,它可以用来抓取图像。
4 修改脚本
修改脚本文件
/home/peng/work/camera/mjpg-streamer/mjpg-streamer/start.sh
./mjpg_streamer -i "./input_uvc.so -y" -o "./output_http.so -w ./www" -o "./output_file.so -f /www/pice -d 15000"
"./input_uvc.so -y" :指定摄像头是YUV,默认是JPEG,一口君使用的罗技摄像头是YUV
"./output_http.so -w ./www" :指定web服务器根目录./www,我们可以通过浏览器测试摄像头
"./output_file.so -f /www/pice -d 15000" : 指定拍照保存照片目录/www/pice,并且每15s保存一次照片
也可以指定分辨率:
./mjpg_streamer -i "input_uvc.so -d /dev/video0 -n -y -r 640x480 -f 30" -o "./output_http.so -w ./www" -o "./output_file.so -f /www/pice -d 15000"
市面上有的摄像头支持格式有YUV,MJPEG,H264 ;mjpg-stream支持MJPEG和YUV两种格式
5 测试
运行
./start.sh
(1)网页测试
(2)网页视频流测试
(3) 拍照功能实现
浏览器上地址栏输入如下内容:
http://127.0.0.1:8080/?action=snapshot
或者
http://127.0.0.1:8080/?action=stream
snapshot 表示每次抓拍一张图形显示在网页上,stream 表示视频流也就是连续的图 像
6. 补充
一口君还使用了一款z-star摄像头,该款摄像头不要添加-y
选项
./mjpg_streamer -i "./input_uvc.so -d /dev/video0" -o "./output_http.so -w ./www" -o "./output_file.so -f /www/pice -d 150000"
有时候摄像头生成的设备文件不是/dev/video0
我们需要对应参数:
-d /dev/video1
五、代码流程
六、支持单拍、连拍
由于 mjpg_stream 中 output-file.so 能实现连续拍照的功能,不能实现单拍或 连拍几张的功能所以需要对 output_file 原码进行修改。修改文件目录:
peng@ubuntu:~/work/camera/mjpg-streamer/mjpg-streamer/plugins/output_file/output_file.c
-
在 196 行 函数 voidworker_thread(voidarg) 体中加入以下代码:
char buf[10]; //用于存放从管道读取的命令
int flags = 0; //拍照标志,1:表示11张照片,2:表示1张照片
int fd_com = 0; //打开管道的文件描述符
int stop_num = 0; //拍照计数
if ( access("/tmp/webcom",F_OK) if ( mkfifo("/tmp/webcom",0666 ) printf("photo fifo create failed\n");
}
}
fd_com = open ("/tmp/webcom",O_RDONLY,0666);
if (fd_com "open the file webcom error");
}
-
在229行 while( ok >= 0 && !pglobal->stop){
后加入
if (flags == 0)
{
while(1)
{
read(fd_com,buf,sizeof(buf));
if (strncmp(buf,"danger",6) == 0) //拍11张照片
{
flags = 1;
bzero(buf,sizeof(buf));
break;
}
if (strncmp(buf,"one",3) == 0) //拍1张照片
{
flags = 2;
bzero(buf,sizeof(buf));
break;
}
}
}
-
在355行
355 /* if specified, wait now */
356 if(delay > 0) {
357 usleep(1000 * delay);
358 }
后加入
stop_num++;
if (flags == 1) //判断拍照的数量
{
if ( stop_num > 9)
{
stop_num = 0;
flags = 0;
}
}
else if (flags == 2)
{
stop_num = 0;
flags = 0;
}
以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !