Sitemap
SUHAL SAMAD

SUHAL SAMAD

Founder @ camsentra.com

Comprehensive Guide: Compiling OpenCV from Source

3 min readJul 6, 2026

--

Compiling OpenCV from source gives you the ultimate flexibility to optimize it for your specific hardware and link it with extra modules (like opencv_contrib). However, a successful build requires a precise sequence of prerequisites.

Step 1: System Update & Essential Tools

Before compiling anything, your system needs basic build utilities, version control, and package management tools.

Bash

sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential cmake git pkg-config
  • build-essential: Installs gcc and g++ (the C/C++ compilers required to read OpenCV's source code).
  • cmake: The build-configuration tool that generates the makefiles.
  • pkg-config: Helps the system find the correct compiler flags and library paths later on.

Step 2: Image and Video Codec Dependencies

OpenCV needs to know how to read, write, and process various media formats. Without these libraries, you won’t be able to open JPEG/PNG images or load MP4/AVI videos.

Bash

sudo apt install -y libjpeg-dev libpng-dev libtiff-dev \
libavcodec-dev libavformat-dev libswscale-dev libv4l-dev \
libxvidcore-dev libx264-dev

Why these matter:

  • Images (libjpeg, libpng, libtiff): Enables functions like cv2.imread() and cv2.imwrite() for standard image formats.
  • Video Streams (libavcodec, libavformat, libswscale): These belong to the FFmpeg ecosystem. Without them, video decoding/encoding will fail.
  • Hardware Cameras (libv4l-dev): Provides Video4Linux support, essential for accessing webcams or USB cameras via cv2.VideoCapture(0).

Step 3: GUI and Optimization Modules

To display windows on your desktop and optimize performance, you need graphical backend libraries and mathematical optimizations.

Bash

sudo apt install -y libgtk-3-dev libatlas-base-dev gfortran
  • libgtk-3-dev: The GTK windowing library. Crucial for UI features like cv2.imshow(), cv2.waitKey(), and rendering bounding boxes on-screen.
  • libatlas-base-dev & gfortran: Installs ATLAS (Automatically Tuned Linear Algebra Software) to supercharge matrix operations behind the scenes.

Step 4: Python 3 and Bindings

If you plan to use OpenCV with Python, you need the Python development headers and numpy (OpenCV treats images as NumPy arrays).

Get SUHAL SAMAD’s stories in your inbox

Join Medium for free to get updates from this writer.

Bash

sudo apt install -y python3-dev python3-numpy

python3-dev: Includes header files required to build Python extensions out of C++ source code.

Step 5: Preparing the Environment & CMake Configuration

Navigate to your OpenCV directory, create a dedicated build directory (to keep the source code clean), and run the configuration engine.

Bash

cd ~/opencv
mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D INSTALL_C_EXAMPLES=OFF \
-D OPENCV_ENABLE_NONFREE=ON \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \
-D PYTHON_EXECUTABLE=$(which python3) \
-D BUILD_EXAMPLES=ON ..

Key Flag Breakdown:

  • -D CMAKE_BUILD_TYPE=RELEASE: Tells the compiler to optimize the code for speed, stripping away slow debugging features.
  • -D OPENCV_ENABLE_NONFREE=ON: Enables patented algorithms (like SIFT) which are legally restricted for commercial use but great for research.
  • -D OPENCV_EXTRA_MODULES_PATH: Points to the opencv_contrib repository containing state-of-the-art computer vision modules.
  • -D PYTHON_EXECUTABLE=$(which python3): Explicitly tells CMake which Python environment should receive the compiled binary (cv2.so).

Critical Troubleshooting: What to check before compiling

Do not start compiling immediately after running cmake. Scroll up through the terminal logs and verify the CMake Status Output Summary:

Section to Check | Expected Success Indicator          | What happens if it's missing?
-----------------|-------------------------------------|----------------------------------------------------------
GUI | GTK+ 3.x: YES | cv2.imshow will throw an error (no GUI support).
Video I/O | FFMPEG: YES / v4l/v4l2: YES | You won't be able to read video files or use a webcam.
Python 3 | Interpreter, Libs, and numpy paths | No Python bindings generated (ModuleNotFoundError).

Once the CMake summary looks flawless, kick off the compilation using all available CPU threads to minimize waiting time:

Bash

# Compile using all CPU cores
make -j$(nproc)
# Install the binaries to your system directory (/usr/local)
sudo make install
sudo ldconfig
  • -j$(nproc): Automatically counts your CPU cores and uses them simultaneously.
  • sudo ldconfig: Configures internal dynamic linker run-time bindings so the OS knows exactly where to look for the newly installed OpenCV shared libraries.

--

--