If you want to stream your OpenCV output image to another device which connected to the same network, one way is to write the OpenCV output as MJPEG file, then stream this file through HTTP.
Please note that:
– This might be not the best way (correct me if I’m wrong)
– OpenCV 2.3
cv::VideoWriter has memory leak bug
0. OpenCV Stuff
I assume you already have your OpenCV libraries installed, because several of OpenCV’s dependencies are also MJPEG-Streamer’s, such as
libjpeg-dev. And make sure your OpenCV application works (it writes the mjpeg file)
1. Install MJPEG-Streamer
Install the dependencies first
sudo apt-get install imagemagick
Then get the latest MJPEG-Streamer from the repository:
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
Then set the environment variable
LD_LIBRARY_PATH if you haven’t, either in
/etc/bash.bashrc or your own
~/.bashrc, add this line:
2. Into The Main Show
First fire up your OpenCV application, this is my application, simple background subtraction and writes the output into mjpg file.
git clone https://github.com/ariandyy/bgsubtract.git cd bgsubtract/ make bgsubtract2
Prepare the folder to put the mjpg file into, for example in my home folder:
Then run the application:
./bgsubtract2 /home/ariandy/mjpg/out.mjpg -bgs
Leave it running in one terminal, and open another terminal to test the MJPEG-Streamer:
mjpeg_streamer -i "input_file.so -f /home/ariandy/mjpg" -o "output_http.so -w /usr/local/www"
The command above is the most basic setting to get the streaming to work. By default, the web server is listening to port 8080. If you want to use port 80, you have to run the command as root (or with sudo).
The default www root of MJPEG-Streamer is located at
3. Viewing The Stream
On the client, simply point the browser to the server’s IP address with corresponding port (8080). e.g. server’s IP address is 192.168.0.1, then to access it from the client, point to
http://192.168.0.1:8080. If you want to omit the
:8080 part, then you have to run the server on port 80 (HTTP), as following:
sudo mjpeg_streamer -i "input_file.so -f /home/ariandy/mjpg" -o "output_http.so -w /usr/local/www -p 80"
I tried this with Google Chrome, Firefox, Android Browser, and Firefox for Android.