一、嵌入式视频图像开源库

在嵌入式系统中,常用的视频图像处理开源系统有:luvcview、cheese、motion、mjpg-streamer或者ffmpeg,其中:
• luvcview: 基于V4L2、SDL的程序,支持拍照录像,参数调节,代码精简实用,适合学习V4L2编程
• cheese:基于V4L2、GTK的程序,支持拍照录像,特殊视频效果
• motion:移动侦测拍照程序
• mjpg-streamer:网络摄像机程序

二、mjpg-streamer简介

MJPG-streamer是一个优秀的开源project,它可以通过HTTP的方式访问linux上面的兼容摄像头,从而做到远程视频传输的效果。

MJPG-streamer从webcam摄像头采集图像,把他们以流的形式通过基于ip的网络传输到浏览器如Firehox,Cambozola,VLC播放器,Windows的移动设备或者其他拥有浏览器的移动设备。

它可以利用某些webcams的硬件压缩功能来降低服务器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
  1. 在 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) < 0 )    //创建有名管道用于接收拍照命令
{if ( mkfifo("/tmp/webcom",0666 ) < 0){printf("photo fifo create failed\n");}
}fd_com = open ("/tmp/webcom",O_RDONLY,0666);
if (fd_com < 0)
{perror ("open the file webcom error");
}
  1. 在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;}}}
  1. 在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;}

手把手教你ubuntu下移植MJPG-streamer相关推荐

  1. 手把手教你Linux下基于ITK开发基础(1)

    手把手教你Linux下基于ITK开发基础(1) *requirement: requirement version git 2.17.1 g++ Ubuntu 7.5.0-3 ubuntu1~18.0 ...

  2. 手把手教你nginx下如何增加网站

    [nginx]手把手教你nginx下如何增加网站 楼主# 更多发布于:2011-08-08 17:06 首先确定下您的环境是否是用按照< redhat 一键安装web环境全攻略>来配置的. ...

  3. [原创]手把手教你Linux下的多线程设计--Linux下多线程编程详解(一)

    本文可任意转载,但必须注明作者和出处. [原创]手把手教你Linux下的多线程设计(一)                                       --Linux下多线程编程详解 原 ...

  4. ubuntu下移植QT基本流程

    配置tftp 配置tftp服务的步骤: 1.安装相关软件包:tftpd(服务端),tftp(客户端),xinetd sudo apt-get install tftpd tftp xinetd 2.建 ...

  5. Docker最全教程之Ubuntu下安装Docker(十五)

    前言 Ubuntu是一个以桌面应用为主的开源GNU/Linux操作系统,应用很广.本篇主要讲述Ubuntu下使用SSH远程登录并安装Docker,并且提供了Docker安装的两种方式,希望对大家有所帮 ...

  6. 【手把手教你Ubuntu】Ubuntu 13.04 win7安装图文教程

    前言:昨日因N卡驱动和bumblebee安装时Hash验证失败就卸了13.04装了12.04LTS,结果问题同样没有解决,这应该就是源或者是和谐墙的原因,害得我折腾了一天,呜呼!今日重回13.04的怀 ...

  7. Linux 小白笔记第八弹,手把手教你Ubuntu(乌班图)搭建samba服务器,从安装到配置。

    引子: 安装在Ubuntu中samba服务器,实现Windows与Ubuntu的文件传输,是非常有必要的.我们直接开始吧! 安装: 第一步: 输入安装命令: sudo apt-get install ...

  8. 手把手教你Linux下的文件管理(一)

    我的十大IT杰出博客参赛主页是:http://2010blog.51cto.com/1060257,请各位支持我,给我投上宝贵一票,谢谢! 随着Linux开源系统平台的不断发展,越来越多的开源软件可以 ...

  9. win10如何更改计算机用户名,手把手教你win10下怎么修改账户用户名

    对于一些刚使用Windows10这款操作系统的用户来说,免不了会遇上一些这样或是那样的问题.例如,有用户会想要进行修改win10默认本地用户名.但是,却又碍于不知道该怎么操作.因此,针对这个问题,今天 ...

最新文章

  1. abap如何找屏幕增强_因增强导致BDC录屏执行异常的梗
  2. 一口气说出 4种 “附近的人” 实现方式,面试官笑了,嘿嘿
  3. C++ COM编程之什么是组件
  4. linux 命令行看图片,骚操作:用终端打开图片
  5. ps字体识别_秒抠毛发,去除海报字体……解锁PS的3个隐藏工具
  6. Webpack 实现 Tree shaking 的前世今生
  7. php cookie防伪造,技术分享:Cookie 防伪造 防修改
  8. HCIE-Security Day39:理论学习:隐私保护
  9. c语言中文内码,用C语言实现常见的三种中文内码转换
  10. 集成电路和芯片的联系与区别
  11. FIR 带通滤波器设计
  12. SX1278调试记录
  13. 小程序入口构造工具二维码测试工具
  14. 东南大学计算机视觉博士招生,基于计算机视觉的手势识别及人机交互技术的应用研究...
  15. 基于GAN的图像修复--论文笔记
  16. 哲理故事与管理之道 20 -用危机激励下属
  17. 生成微信支付二维码及微信支付
  18. ContextCaptureMaster/Smart3D 集群处理详解
  19. 提升点击如何实现百度关键词快速排名原理!
  20. 如何端正的去学好编程

热门文章

  1. 支付宝沙箱使用详细教程(Java版本)
  2. Distributing Ballot Boxes HDU - 4190
  3. 烽火推系统源码,抖音矩阵系统源码, lucky。
  4. React 之 函数式组件使用props
  5. java 当前路径_java获取路径(url) path
  6. mysql fulltext
  7. php socket tcp 客户端
  8. 感谢网友雪飘零寄给我这么多书
  9. 快一起来看看如何把音频转化为文字吧
  10. corona group