Optimizing opencv 3.4 in Raspberry Pi 3 using GStreamer
OpenCV (Open Source Computer Vision Library) is an open source computer vision and machine learning software library.
In this tutorial we will follow the steps to build an opencv library optimized for the raspberry pi 3 arm cortex processor with gstreamer.
These optimizations consist of building OpenCV binaries that make use of the NEON instructions and VFPV architecture.
These technologies are a great aid when dealing with large arrays of data, and SIMD instructions.
Use the following table to navigate the content, and let’s start!.
Step 1: Dependencies
Delete Wolfram Engine and LibreOffice to free 500MB ~ 1GB of disk space:
sudo apt-get purge wolfram-engine
sudo apt-get purge libreoffice*
sudo apt-get clean
sudo apt-get autoremove
Update and upgrade your current packages, and install opencv dependencies:
sudo apt update && sudo apt upgrade
sudo apt install -y build-essential cmake pkg-config
sudo apt install -y libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev
sudo apt install -y libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt install -y libgtk2.0-dev libgtk-3-dev
sudo apt install -y libcanberra-gtk*
sudo apt install -y libatlas-base-dev gfortran
sudo apt install -y python2.7-dev python3-dev
# x264 Libraries
sudo apt install -y libxvidcore-dev libx264-dev
# GStreamer libraries
sudo apt install -y libgstreamer1.0-
sudo apt install -y libgstreamer-plugins-base1.0-
sudo apt install -y gstreamer1.0 *
Step 2: Download OpenCV
Download Opencv 2.4.13.5 from https://opencv.org/releases.html
$ cd
$ wget https://github.com/opencv/opencv/archive/3.4.1.zip
$ unzip 3.4.1.zip
$ wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/3.4.1.zip
$ unzip opencv_contrib.zip
$ cd opencv-3.4.1/
Step 3: Edit the compiler options
Open the file opencvcompileroptions.cmake :
$ nano cmake/OpenCVCompilerOptions.cmake
Locate the line containing:
# ocv_update(CPU_VFPV3_FLAGS_ON "-mfpu=vfpv3")
And replace it with:
# ocv_update(CPU_VFPV3_FLAGS_ON "-mcpu=cortex-a7 -mfpu=neon-vfpv4 -ftree-vectorize -mfloat-abi=hard")
Save the file, verify the changes made.
Step 4: Increase the swap size
Now, let’s increase the swap size so gcc can use all 4 cores of the Raspberry Pi 3.
Open the file /etc/dphys-swapfile and edit CONF_SWAPSIZE variable:
CONF_SWAPSIZE=1024
If you do not perform this step it’s very likely that gcc will crash when building the libraries using 4 threads.
Remember to change the swap size back to CONF_SWAPSIZE=100 once the installation is done.
WARNING: Increasing the SWAP_SIZE will reduce the lifespan of your SD card due to multiple rewrites in the flash card. Please consider doing a backup of your SD-card. Avoid using this SD-card for a final product, instead consider cloning the content of the memory into an SD-card image once your product is fully configured (with all its dependencies compiled and installed).
Restart the swapfile service:
$ sudo /etc/init.d/dphys-swapfile stop
$ sudo /etc/init.d/dphys-swapfile start
Use htop to verify that the swap size increased.
Step 5: Compile and install OpenCV
Now let’s build OpenCV libraries:
$ mkdir build
$ cd build
cmake \
-D CMAKE_BUILD_TYPE=RELEASE \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
-D ENABLE_NEON=ON \
-D ENABLE_VFPV3=ON \
-D WITH_TBB=ON \
-D WITH_GSTREAMER=ON \
-D EXTRA_C_FLAGS=-mcpu=cortex-a7 -mfpu=neon-vfpv4 vectorize abi=hard \
-D EXTRA_CXX_FLAGS=-mcpu=cortex-a7 -mfpu=neon-vfpv4 vectorize abi=hard \
-D BUILD_TESTS=OFF \
-D WITH_LAPACK=OFF \
-D WITH_EIGEN=OFF \
-D INSTALL_C_EXAMPLES=OFF \
-D INSTALL_PYTHON_EXAMPLES=OFF \
-D BUILD_EXAMPLES=OFF
Here comes the time consuming part, now run:
$ make -j4
And wait for 2-3 hours until it finishes. Remember to check the process every now and then.
Note: using a heatsink for the processor and keeping it as cool as possible, will likely reduce the compilation time.
When (and if) OpenCV is finally compiled, install it in the linux system using:
$ sudo make install
$ sudo ldconfig
Step 6: Decrease the swap size
Edit the file /etc/dphys-swapfile and change the CONF_SWAPSIZE variable:
CONF_SWAPSIZE=100
Restart the swapfile service:
$ sudo /etc/init.d/dphys-swapfile stop
$ sudo /etc/init.d/dphys-swapfile start
Now you can have an OpenCV built to make the best use of the processor in your Raspberry Pi 3.
Changes for OpenCV 3.1
In step 2, download OpenCV 3.1
$ wget -O opencv.zip https://github.com/Itseez/opencv/archive/3.3.0.zip
$ unzip opencv.zip
$ wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/3.3.0.zip
$ unzip opencv_contrib.zip
In step 5, add the flag: 7
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.3.0/modules
Blind 1 is the interior blind wound on the bottom spring roller 5 and hooked up to the higher roller 6, blind
2 is wound on the bottom spring roller 7 and hooked up to the upper
roller 8. The blind displacement (slit width) is achieved by persevering with to wind roller 8 after blind 1 has been totally wound.
23 is pulled down by a spring hooked up to the highest of
the rod and mounted to the bottom of the shutter, its progress is retarded by the pneumatic delay cylinder.
The timing gadget sits on prime of the take-up drums.
Because the leaf spring 29 is lowered so rod 31 is pushed
down, the highest of 31 carries a catch 33 which can also be lowered.
The speeds are set by moving an exterior lever which strikes
the velocity setting rod which adjusts the circulation of air to and from the pneumatic cylinder.
Thank you a bunch for sharing this with all of us you actually
recognize what you are speaking about! Bookmarked. Please also discuss with my
site =). We can have a hyperlink exchange agreement between us
My web site … jasa pembuatan program kasir
I don’t even know the way I ended up here,
but I believed this put up used to be good. I don’t realize
who you are but definitely you’re going to a famous blogger when you aren’t
already. Cheers!
Thanks on your marvelous posting! I really enjoyed reading it, you might be a great author.
I will ensure that I bookmark your blog and will come back at
some point. I want to encourage you to ultimately continue
your great posts, have a nice day!
This post is really a nice one it helps new the web people, who are wishing in favor of blogging.
My web page: Aplikasi Edit Video
You really make it seem so easy together with
your presentation but I to find this topic to be actually one thing which I
think I’d never understand. It kind of feels too complex and very broad for me.
I am having a look forward to your next put up, I
will try to get the hang of it!
Thanks designed for sharing such a nice opinion, article
is pleasant, thats why i have read it entirely
Here is my web-site: jasa Desain company profile
Usually I don’t read post on blogs, however I wish to say that this
write-up very compelled me to take a look at and do it!
Your writing taste has been amazed me. Thanks, quite
great article.
Appreciating the persistence you put into your site and detailed information you offer.
It’s awesome to come across a blog every once in a while that isn’t the same out of date rehashed information. Wonderful read!
I’ve bookmarked your site and I’m adding your RSS feeds to
my Google account.
Do you have a spam problem on this blog; I also am a blogger,
and I was wanting to know your situation; we have developed some
nice methods and we are looking to trade methods with others, be sure to
shoot me an e-mail if interested.