既然要做视频小车,那一定要能看到摄像头输出了。
但是如果想使用opencv处理图像,也得使用摄像头。但是经验告诉我们,不可能两个程序同时使用同一个摄像头的,所以最好的办法是将两个组合使用。
由于之前在wrtnode(一个基于openwrt系统的开发板)上使用过mjpg-streamer,所以想到图传首先想到的就是mjpg-streamer。mjpg-streamer是开放源码的,所以我最先的想法是下载下来mjpg-streamer,看看能不能修改源码,将opencv图像处理的代码塞入到获取摄像头图像和发送图像之间,然后偷梁换柱,将处理后的图像发送。这样做虽然本身工作量不是很大,但是要看大量的代码,想想还是挺兴奋的。
首先简单的介绍下mjpg-streamer,以下引用wiki介绍:
mjpg-streamer is a command line application that copies JPEG frames from one or more input plugins to multiple output plugins. It can be used to stream JPEG files over an IP-based network from a webcam to various types of viewers such as Chrome, Firefox, Cambozola, VLC, mplayer, and other software capable of receiving MJPG streams.
--https://github.com/jacksonliam/mjpg-streamer
在linux 下,所有的设备都是当作文件处理的,既然mjpg-streamer的本质是传送文件,那么能否使用自己写的文件呢?现在的问题变成了如何使用opencv产生一个mjpg 文件。
Google。。。 。。。 。。。
果然送到了相关的技术文章,他做的事情正是我打算做的,得来全不费工夫。文章链接如下:
https://ariandy1.wordpress.com/2013/04/07/streaming-opencv-output-through-httpnetwork-with-mjpeg/
用google搜索技术文章的一个技巧就是不要输入中文,因为mjpg-streamer是外国人开发的软件,英文的技术贴相对较多。
废话不多说,直接上教程。
首先安装mjpg-streamer:
git clone https://github.com/codewithpassion/mjpg-streamer.git
cd mjpg-streamer/mjpg-streamer
make USE_LIBV4L2=true clean all
sudo make DESTDIR=/usr/local install
然后增加动态库搜索路径:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
为了避免每次开机都要重新设置,可以将这一行加入 ~/.bashrc中。
然后是安装opencv 相关的代码,作者给出了自己代码的链接,安装如下:
git clone https://github.com/ariandyy/bgsubtract.git
cd bgsubtract/
make bgsubtract2
其中比较重要的就是bgsubtract2.cpp文件。可以根据自己的需要修改。
作者的源程序运行命令如下:
./bgsubtract2 /home/[yourname]/mjpg/out.mjpg -bgs
其中/home/ariandy/mjpg/out.mjpg是输出mjpg文件的文件名,-bgs是决定是否对图像进行背景处理,我试了一下,效果不好,所以我使用的时候都是不加-bgs的。
另外还有一点注意的是,路径文件夹必须存在,否则程序会运行出错,当然也可以自行修改程序,先判断路径文件夹是否存在,如果不存在则自行创建。
另外因为mjpg文件会发生大量的读写,所以对存储器的损害较大,所以最好是写在/tmp文件夹下。所以使用命令如下:
./bgsubtract2 /temp/mjpg/out.mjpg
启用mjpg-streamer:
mjpeg_streamer -i "input_file.so -f /tmp/mjpg" -o "output_http.so -w /usr/local/www"
其中/usr/local/www网页服务器的根目录,要根据自己的实际情况修改。
下次更新会讲解http服务器的搭建,敬请期待。