In this tutorial we will follow the steps to build an opencv library optimized for the raspberry pi3 arm cortex processor.

This optimizations consist on 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.


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-plugins-*


Step 2: Download OpenCV

Download Opencv from

$ cd

$ wget

$ unzip

$ wget -O

$ unzip

$ 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:


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.

$ htop


Step 5: Compile and install OpenCV

Now let’s build opencv libraries:

$ mkdir build

$ cd build

cmake \


-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \





-D EXTRA_C_FLAGS=-mcpu=cortex-a7 -mfpu=neon-vfpv4 -ftree-vectorize -mfloat-abi=hard \

-D EXTRA_CXX_FLAGS=-mcpu=cortex-a7 -mfpu=neon-vfpv4 -ftree-vectorize -mfloat-abi=hard \








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:


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 with:

$ wget -O

$ unzip

$ wget -O

$ unzip


In step 5, add the flag:

-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.3.0/modules