Присоединяйтесь!
Авторизация
opencv   

Кросс-компиляция OpenCV для Raspberry Pi

20 October 2019 - Автор arkan

Как-то раз мне потребовалось использовать известную библиотеку OpenCV в своём Qt приложении. Скачав OpenCV из репозитория через apt-get я столкнулся с проблемой, что она никак не хотела прилинковываться к моему приложению, выдавая ошибку при компиляции. Погуглив ошибку выяснилось, что OpenCV либы в репозитории были собраны свежей версией компилятора gcc с какими-то хитрыми инструкциями из-за чего возникали проблемы. Что ж, придётся кросс-компилировать OpenCV из исходников на ноуте старой версией gcc (можно скомпилить на RasPi, но это долго (тут пишут, что процесс занимает 10-12 часов), поэтому воспользуемся кросс-компиляцией для ARM процессора на более мощном компьютере. Ниже я подробно опишу, как это сделать.

Подготовка

Скачиваем инструментарий с кросс-компиляторомgit clone https://github.com/raspberrypi/tools.git

В папкеarm-bcm2708 вы найдёте различные виды кросс-компиляторов. Я использую gcc-linaro-arm-linux-gnueabihf-raspbian-x64 (поскольку у меня на ноуте 64-битный процессор)

Добавляем кросс-компилятор в переменную $PATH. Для этого в конец файла .bashrc добавляем строчку PATH=$PATH:/opt/arm/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

Вставляем microSD карту из Raspberry Pi в ноутбук или usb-кардридер и копируем папки lib и usr в /opt/arm/RaspberryPi/sysroot

Настраиваем исходники OpenCV

Будем использовать конфигурацию платформенной сборки, поэтому копируем файлopencv/platforms/linux/arm-gnueabi.toolchain.cmake в pi.cmake, который мы будем далее редактировать. Редактируем pi.cmake следующим образом:

Находим строки

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mthumb -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mthumb -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi")

и меняем на

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi -march=armv6 -mfloat-abi=hard -mfpu=vfp")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi -march=armv6 -mfloat-abi=hard -mfpu=vfp")

Также нужно удалить строки

set(FLOAT_ABI_SUFFIX "")
if (NOT SOFTFP)
set(FLOAT_ABI_SUFFIX "hf")
endif()

и вставить set(FLOAT_ABI_SUFFIX "hf")

Из этих строк вырезаем версию компилятора

find_program(CMAKE_C_COMPILER NAMES arm-linux-gnueabi${FLOAT_ABI_SUFFIX}-gcc-${GCC_COMPILER_VERSION})
find_program(CMAKE_CXX_COMPILER NAMES arm-linux-gnueabi${FLOAT_ABI_SUFFIX}-g++-${GCC_COMPILER_VERSION})

Чтобы получилось так

find_program(CMAKE_C_COMPILER NAMES arm-linux-gnueabi${FLOAT_ABI_SUFFIX}-gcc)
find_program(CMAKE_CXX_COMPILER NAMES arm-linux-gnueabi${FLOAT_ABI_SUFFIX}-g++)

Прописываем путь до sysroot

set(ARM_LINUX_SYSROOT /opt/arm/RaspberryPi/sysroot CACHE PATH "ARM cross compilation system root")

Если при сборке cmake не сможет найти архиватор, то добавьте ещё такие строки

set(CMAKE_AR /opt/arm/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-ar CACHE FILEPATH "Archiver")

Компиляция

Создаём папку для сборки и заходим в неё

mkdir build
cd build

Запускаем cmake

cmake \
-D CMAKE_TOOLCHAIN_FILE=../platforms/linux/pi.cmake \
-D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/opt/arm/RaspberryPi/sysroot \
-D INSTALL_C_EXAMPLES=OFF \
-D INSTALL_PYTHON_EXAMPLES=OFF \
-D BUILD_EXAMPLES=OFF ..

Собираем - make -j4 , параметр j определяет сколько ядер процессора задействовать при сборке. У меня их 4

Устанавливаем sudo make install после этого в sysroot скопируются скомпиленные либы OpenCV

На этом всё, удачной компиляции!

20 October 2019
arkan
автор статьи

Комментариев: 0

Ваш комментарий будет первым

Отправить комментарий

Авторизуйтесь для отправки комментария

Присоединяйтесь
Новые сообщения