Skip to content

Instantly share code, notes, and snippets.

@rainbowflesh
Last active July 26, 2024 14:18
Show Gist options
  • Select an option

  • Save rainbowflesh/c9401831f20a3354b236ac24708c0ced to your computer and use it in GitHub Desktop.

Select an option

Save rainbowflesh/c9401831f20a3354b236ac24708c0ced to your computer and use it in GitHub Desktop.
OpenCV arm64/aarch64 Cross Compile Guide

The OpenCV arm64/aarch64 Cross Compile Guide

I use official ubuntu jammy docker image in WLS2 ubuntu 2404, target platform is Radxa 3 with RockChip 3568 aarch64 cpu.

Preparation

docker pull Ubuntu:Jammy
docker images
docker run -it <imgid> /bin/bash

useradd -s '/bin/bash' -m -G adm,sudo theultimateopencvcrosscompileprofile
passwd theultimateopencvcrosscompileprofile
passwd root
su theultimateopencvcrosscompileprofile
sudo dpkg --add-architecture arm64

# Get basic softwares
sudo apt update
sudo apt install -y \
build-essential \
cmake \
crossbuild-essential-arm64 \
curl \
gcc \
gcc-arm-linux-gnueabi \
git \
neofetch \
ninja-build \
pkg-config \
pkgconf \
python3 \
sudo \
wget

# dont forget arm64 deps
sudo apt install -y \
ibavcodec-dev:arm64 \
libavcodec-dev \
libavformat-dev \
libavformat-dev:arm64 \
libavutil-dev:arm64 \
libdc1394-dev \
libdc1394-dev:arm64 \
libfreetype-dev:arm64 \
libglib2.0-dev:arm64 \
libgtk-3-dev \
libgtk2.0-dev \
libgtk2.0-dev:arm64 \
libgtkglext1 \
libgtkglext1-dev \
libharfbuzz-dev:arm64 \
libjpeg-dev \
libpng-dev \
libpython3-dev:arm64 \
libswscale-dev \
libswscale-dev:arm64 \
libtbb-dev \
libtbb2 \
libtiff-dev \
libv4l-dev \
libx264-dev \
libxvidcore-dev \
python3-dev \
python3-numpy

# Tweak apt mirrors if needed

sudo apt install -y vim
sudo vim /etc/apt/source.list

deb [arch=amd64] http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted
deb [arch=amd64] http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted
deb [arch=amd64] http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy universe
deb [arch=amd64] http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates universe
deb [arch=amd64] http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy multiverse
deb [arch=amd64] http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates multiverse
deb [arch=amd64] http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb [arch=amd64] http://security.ubuntu.com/ubuntu jammy-security main restricted universe multiverse

deb [arch=arm64] http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy main multiverse universe
deb [arch=arm64] http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-security main multiverse universe
deb [arch=arm64] http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-backports main multiverse universe
deb [arch=arm64] http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-updates main multiverse universe

Get OpenCV source

cd
git clone https://github.com/opencv/opencv.git
cd opencv
git checkout 4.10.0
cd ..

git clone https://github.com/opencv/opencv_contrib.git
cd opencv_contrib
git checkout 4.10.0
cd ..

Build configure

PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig \
PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu \
cmake ../opencv \
-DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules/ \
-DCMAKE_TOOLCHAIN_FILE=/home/theultimateopencvcrosscompileprofile/opencv/platforms/linux/aarch64-gnu.toolchain.cmake \
-GNinja"

Or a Script

cat <<EOF > configure
#!/bin/bash
build_dir="build"
read -p "Build directory exists, overwrite? (Y/n): " choice
case "$choice" in
    [Nn]|[Nn][oO])
        echo "Exiting without clearing or creating '$build_dir'."
        exit 0
        ;;
    *)  
        if [ -d "$build_dir" ]; then
            echo "Clearing contents of '$build_dir'..."
            rm -rf "$build_dir"/*
        else
            echo "Creating '$build_dir' directory..."
            mkdir "$build_dir"
        fi
        ;;
esac
cd "$build_dir"

PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig \
PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu \
cmake ../opencv \
-DCMAKE_BUILD_TYPE=Release \
-DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules/ \
-DCMAKE_TOOLCHAIN_FILE=/home/rainbow/opencv/platforms/linux/aarch64-gnu.toolchain.cmake \
-DBUILD_TESTS=OFF \
-DBUILD_PERF_TESTS=OFF \
-DBUILD_EXAMPLES=OFF \
-DBUILD_opencv_python2=OFF \
-DBUILD_JAVA=OFF \
-DWITH_GTK3=OFF \
-DWITH_QT=OFF \
-DBUILD_ljasper=ON \
-DWITH_GTK=ON \
-DWITH_GTK_2_X=ON \
-DBUILD_FFMPEG=ON \
-DWITH_FFMPEG=ON \
-DOPENCV_FFMPEG_SKIP_BUILD_CHECK=ON \
-DOPENCV_ENABLE_PKG_CONFIG=ON\
-DOPENCV_UI_BACKEND=GTK,GTK2 \
-DBUILD_LIST=core,videoio,highgui,calib3d,dnn,flann,features2d,imgcodecs,imgproc,objdetect,plot,tracking \
-GNinja"
EOF
chmod +x configure
./configure

Build

cmake --build build -j20

Dist

mkdir dist
cp -r build/lib/ opencv/include/ opencv/modules/*/include/ opencv_contrib/modules/*/include/ dist
tar zcf dist.tgz dist

Done!

References

https://docs.opencv.org/4.10.0/d3/dd9/tutorial_crosscompile_with_multiarch.html

https://docs.opencv.org/4.x/d6/dea/tutorial_env_reference.html

https://docs.opencv.org/4.10.0/d0/d76/tutorial_arm_crosscompile_with_cmake.html

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment