MJPG-streamer方案实现物联网视频监控

目录

前言

一、JPEG,MJPG格式简介

1.JPEG

2.MJPG

3.MJPG的优点

4.MJPG的缺点

二、软硬件准备

三、编译MJPG-streamer

四、运行MJPG-streamer

五、其它常见用法

1.查看帮助

2.应用示例

六、MJPG-streamer 程序框架

七、源码下载


前言

最近想做一个安防相关的项目,所以跟着韦东山老师的视频来学习视频监控方案的相关知识,韦东山老师讲的课非常好,这里用到的开发板是IMX6ULL。

一、JPEG,MJPG格式简介

1.JPEG

  • 简称JPG
  • 上过美术课的人都知道一个象素的颜色可以用RGB三原色来表示,其实还可以用YUV格式来表示使用RGB、YUV的格式编码的照片,文件都很大,比如常见的BMP文件就是用RGB编码
  • 把一个BMP文件转换为JPEG文件,可以发现图片质量没发生变化,但是文件变小了很多
  • JPEG是根据人体视觉的特点采用了YCbCr格式,大大压缩了照片的大小

2.MJPG

  • Motion JPEG,简称MJPG
  • JPEG是静态图片的编码格式,MJPG是动态的视频编码格式
  • 可以简理解:MJPG就是把多个JPEG图片连续显示出来

3.MJPG的优点

  • 很多摄像头本身就支持JPEG、MJPG,所以处理器不需要做太多处理
  • 一般的低性能处理器就可以传输MJPG视频流

4.MJPG的缺点

  • MJPG只是多个JPEG图片的组合,它不考虑前后两数据的变化,总是传输一顿帧图像: 传输带宽要求高
  • H264等视频格式,会考虑前后两顿数据的变化,只传输变化的数据: 传输带宽要求低

二、软硬件准备

硬件:a. 100ASK_IMX6ULL开发板 (或其他Linux开发板);b. USB摄像头
软件:a. Ubuntu;b. Buildroot(Buildroot会自动下载其他软件: MJPG-streamer, ffmpeg, nginx)

三、编译MJPG-streamer

进入Buildroot根目录

执行命令

make menuconfig 

/ 搜索 mjpg 查找 MJPG-streamer 位置

选上MJPG-streamer后退出保存

执行命令 make

这会在Buildroot的dl/mjpg-streamer目录下自动下载源码,并编译

结果保存在output/images目录下,有emmc.img, sdcard.img,可以直接烧写到板能的EMMC或SD卡上

编译后的结果

ls output/images/

烧写.img后缀到IMX6ULL开发板

四、运行MJPG-streamer

在开发板上安装好MJPG-streamer后,执行命令:

mjpg_streamer -i "/usr/lib/mjpg-streamer/input_uvc.so -d /dev/video1 -f 30 -q 90 -n" -o "/usr/lib/mjpg-streamer/output_http.so -w /usr/share/mjpg-streamer/www"
  1. mjpg_streamer 是 MJPG-streamer 的可执行文件。
  2. -i 参数指定输入插件(input plugin)。在这个例子中,输入插件是 /usr/lib/mjpg-streamer/input_uvc.so,它用于从摄像头设备 /dev/video1 获取视频流。
  3. -d 参数指定了设备路径,即 /dev/video1
  4. -f 参数设置了帧率,这里设置为 30 fps (frames per second)。
  5. -q 参数设置了质量级别,这里设置为 90。
  6. -n 参数表示不使用 YUYV 格式。
  7. -o 参数指定输出插件(output plugin)。在这个例子中,输出插件是 /usr/lib/mjpg-streamer/output_http.so,它将视频流通过 HTTP 协议输出。
  8. -w 参数指定了 Web 服务器的工作目录,这里设置为 /usr/share/mjpg-streamer/www

总结:这个命令行启动了一个 MJPG-streamer 服务器,从 /dev/video1 设备获取视频流,以 30 fps 和 90% 的质量进行传输,并通过 HTTP 协议在 /usr/share/mjpg-streamer/www 目录下提供视频流访问。

在这里我的开发板IP为:192.168.5.9,要确保PC或手机,跟开发板处于同一个局域网,然后直接在浏览器中打开: http://192.168.5.9:8080/stream.html,就可以看见视频了。

五、其它常见用法

1.查看帮助

mjpg_streamer -o "/usr/lib/mjpg-streamer/output_file.so --help"
mjpg_streamer -i "/usr/lib/mjpg-streamer/input_file.so --help"

2.应用示例

把摄像头数据存为JPG文件:

从input得到数据 保存到tmp目录

 mjpg_streamer -i "/usr/lib/mjpg-streamer/input_uvc.so -d /dev/video1 -f 30 -q 90 -n" -o "/usr/lib/mjpg-streamer/output_file.so -f /tmp"

把JPG文件输出到浏览器:

从tmp目录获得文件发到浏览器

mjpg_streamer -i "/usr/lib/mjpg-streamer/input_file.so -e -f /tmp" -o "/usr/lib/mjpg-streamer/output_http.so -w /usr/share/mjpg-streamer/www"

然后跟上面一样,直接在浏览器中打开: http://192.168.5.9:8080/stream.html,就可以观察到刚刚摄像头保存的图片数据。

六、MJPG-streamer 程序框架

buildroot选择MJPG-streamer编译完成后,会得到MJPG-streamer的源码。

源码存放在dl目录里,我们可以进入目录里面,把源码上传到 windows,然后用source insight打开来进行分析,下图是MJPG-streamer 程序框架。

七、源码下载

MJPG-streamer源码

  • 20
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
首先,你需要安装mjpg-streamer到你的树莓派上,可以通过以下命令进行安装: ``` sudo apt-get update sudo apt-get install subversion libjpeg-dev imagemagick libv4l-dev svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg-streamer cd mjpg-streamer/mjpg-streamer make sudo make install ``` 安装完毕后,你需要下载并安装OpenCV,可以通过以下命令进行安装: ``` sudo apt-get install libopencv-dev python-opencv ``` 现在,你已经准备好开始使用mjpg-streamer和OpenCV来实现人形检测了。以下是一些基本步骤: 1. 启动mjpg-streamer ``` cd /usr/local/share/mjpg-streamer/ ./mjpg_streamer -i "input_uvc.so" -o "output_http.so -w ./www" ``` 这将启动mjpg-streamer并将其绑定到默认的视频设备(通常是/dev/video0)。现在你可以在浏览器中输入你的树莓派IP地址和端口号(默认为8080)来查看摄像头的实时视频流。 2. 导入OpenCV 在Python中,你需要导入OpenCV库来处理视频流和图像: ``` import cv2 ``` 3. 检测人形 以下是一个简单的示例代码,用于从mjpg-streamer视频流中检测人形: ``` import cv2 cap = cv2.VideoCapture('http://localhost:8080/?action=stream') while True: ret, frame = cap.read() if not ret: break gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 使用OpenCV的人形分类器进行检测 face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') faces = face_cascade.detectMultiScale(gray, scaleFactor=1.5, minNeighbors=5) # 在图像上绘制检测到的人形 for (x, y, w, h) in faces: cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2) cv2.imshow('frame', frame) if cv2.waitKey(1) == ord('q'): break cap.release() cv2.destroyAllWindows() ``` 在这个示例中,我们从mjpg-streamer视频流中读取每一帧,并将其转换为灰度图像。然后,我们使用OpenCV的人形分类器来检测人形,然后在图像上绘制矩形来标识检测到的人形。最后,我们在窗口中显示标记的图像。 请注意,这只是一个简单的示例,你可以根据自己的需求进行自定义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热爱嵌入式的小佳同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值