Последнее обновление:
March 8, 2020

Есть мысль... Жми, напиши!
Что имеем: Постов : 169 Авторов: 1 Категорий: 28

Qt QML OpenGL(es) application on Linux without X11/Wayland/etc (kiosk mode)

Потребовалось мне сделать управляющий софт под один девайс. То есть при загрузке он должен сразу стартовать и отображаться всё время на экране. По сути типо терминала. Зовётся это в народе «режим киоска».

Можно было бы не париться и установить обычную, десктопную систему, но очень не хотелось тащить оконный менеджер, оболочку и прочее за собой, дабы избавиться от посредников прорисовки, ну и что бы дистр с софтом весил как можно меньше. За основу был взят Ubuntu Server 19.10 (можно и ещё более облегчённый дистр).

Разумеется при попытке сразу запустить QML приложение (QML выводит всё через OpenGL) он выдал про невозможность запуска с платформой «xcb», а если указать «-platform eglfs» (то есть принудительно укажем через что выводить), выдаёт «Could not initialize egl display», то есть не может открыть дисплей (потому что eglsfs скомпилирован только для «X11»), нус, будем компилировать для работы напрямую, то есть пересобирать Qt из исходников.

Будет две машины, одна «рабочая» (на которой и будет происходить компиляция, стоит Ubuntu 19.10 Desktop), другая «тестовая» (на которой будем запускать приложение, стоит Ubuntu Server 19.10, при установке включите «OpenSSH Server» для удалённого доступа с рабочей машины).

Кстати, на тестовой машине должна быть хоть какая-нибудь видеокарта с поддержкой OpenGL 3.1. Проверить, можно поставив kmscube (заодно ставим доп. пакеты, скорее всего все они не нужны, но чтоб наверняка):

sudo apt install cmscube
sudo apt install mesa-utils
sudo aptt install libglu1-mesa freeglut3 mesa-common
cmscube

Должна запуститься демка c вращающимся кубом. Возможно, нужно будет поставить ещё драйвера (об этом в конце поста).

Переходим на рабочую.
Нужно загрузить все либы для компиляции (наверняка тут слишком много лишних, но я точно уже не помню какие именно, так что вот весь список, чтоб наверняка)

sudo apt install libglu1-mesa libglu1-mesa-dev build-essential libgl1-mesa-dev freeglut3 freeglut3-dev mesa-common-dev libglapi-mesa libosmesa6 mesa-utils libdrm-dev libgbm-dev libgbm1 libgegl-0.3-0 libgegl-dev mesa-utils-extra gegl libglfw3-dev libgles2-mesa-dev libglew1.5 libglew1.5-dev libgl1-mesa-glx

Качаем исходники

BASEPATH=/home/pavelk/QtOpenGL
mkdir $BASEPATH
cd $BASEPATH
git clone https://github.com/qt/qt5 Qt5Sources
cd Qt5Sources
perl init-repository #Успеем фильмак глянуть, пока делается
git checkout 5.14
git submodule update --recursive

Настраиваем сборку

export QT_QPA_EGLFS_INTEGRATION=eglfs_kms
./configure -platform linux-g++-64 -skip wayland -skip script -skip webengine -no-pch -no-xcb -no-xcb-xlib -no-gtk -nomake tests -nomake examples -reduce-exports -kms -eglfs -opengl es2 -opensource -release -confirm-license -make libs -prefix $BASEPATH/qt5 -v

Возможно, нужно будет добавить ещё «-qpa eglfs».
По завершению главное в выхлопе что бы было вот это:

QPA backends:
EGLFS ................................ yes
EGLFS details:
  EGLFS i.Mx6 ........................ no
  EGLFS i.Mx6 Wayland ................ no
  EGLFS EGLDevice .................... yes !!!
  EGLFS GBM .......................... yes
  EGLFS Mali ......................... no
  EGLFS Rasberry Pi .................. no
  EGL on X11 ......................... no

Та самая заветная платформа и интеграция.

Если нужно перенастроить/пересобрать, то перед запуском нужно обязательно очистить старые результаты командой: «git clean -dxf»

Ну а дальше компилируем, ставим.

make
make install

Собираться будет дооолго.

По завершению подготавливаем QtCreator, идём в «инструменты»->»параметры».

Что бы иметь возможность сразу запускать на тестовой машине:
Устройства -> Устройства, Добавить, «Обычное Linux устройство»
Название по вкусу, у меня «Test»
IP адрес устройства — айпишник тестовой машины (узнать можно залогинившись на ней и ввести «ifconfig»)
Имя пользователя — соответственно имя пользователя, которое вводили при установке.

Дальше устанавливаем ключ:
жмём «создать новую пару ключей» и запоминаем путь «файла открытого ключа» (что-то вроде «/home/pavelk/.ssh/qtc_id.pub»), прожимаем «создать и сохранить».
Далее открытый ключ нужно скопировать на тестовую машину, для этого в консольке рабочей прописываем:
«ssh-copy-id -i /home/pavelk/.ssh/qtc_id.pub user@192.168.0.193»
Только замените значения на свои.
Завершаем, проверка должна пройти без ошибок.

Комплекты -> Профили Qt, жмём Добавить
Путь: /home/pavelk/qt5/bin/qmake
Название по вкусу, у меня «OpenGLKMS»

Комплекты -> Комплекты, жмём Добавить
Компиляторы ставим те, которыми собирали.
В «Профиль Qt» выбираем созданный на предыдущем шаге
Название по вкусу, у меня «QOpenGLKMS»
Тип устройства выбираем «Обычное Linux устройство»
Устройство выбираем добавленное на предыдущем шаге.

Логинимся на тестовую машину, ставим доп. пакеты, создаём необходимые директории для библиотек Qt и переменные окружения:

sudo su
apt install mesa-utils
apt install libgles2-mesa
apt install libglfw3
apt install libharfbuzz0b
apt install libfontconfig1
apt install libmtdev1
apt install libinput10
apt install libts0

usermod -aG input user

mkdir /usr/local/lib/Qt/
mkdir /usr/local/lib/Qt/lib
chown -R user:root /usr/local/lib/Qt/

echo "/usr/local/lib/Qt/lib" > /etc/ld.so.conf.d/qt.conf
echo 'QML2_IMPORT_PATH="/usr/local/lib/Qt/qml"' >> /etc/environment
echo 'QT_PLUGIN_PATH="/usr/local/lib/plugins"' >> /etc/environment

reboot

Только имя пользователя «user» замените на своё, которое на тестовой машине.

Возвращаемся на рабочую, необходимо на тестовую скопировать либы Qt:

IP=192.168.0.193
USER=user
scp -r $BASEPATH/qt5/plugins $USER@$IP:/usr/local/lib/Qt/
scp -r $BASEPATH/qt5/qml $USER@$IP:/usr/local/lib/Qt/

scp $BASEPATH/qt5/plugins/egldeviceintegrations/libqeglfs-kms-egldevice-integration.so $USER@$IP:/usr/local/lib/Qt/plugins/egldeviceintegrations
scp $BASEPATH/qt5/lib/libQt5Core.so.5 $USER@$IP:/usr/local/lib/Qt/lib 
scp $BASEPATH/qt5/lib/libQt5Gui.so.5 $USER@$IP:/usr/local/lib/Qt/lib
scp $BASEPATH/qt5/lib/libQt5Qml.so.5 $USER@$IP:/usr/local/lib/Qt/lib
scp $BASEPATH/qt5/lib/libQt5Network.so.5 $USER@$IP:/usr/local/lib/Qt/lib
scp $BASEPATH/qt5/lib/libQt5EglFSDeviceIntegration.so.5 $USER@$IP:/usr/local/lib/Qt/lib
scp $BASEPATH/qt5/lib/libQt5DBus.so.5 $USER@$IP:/usr/local/lib/Qt/lib
scp $BASEPATH/qt5/lib/libQt5EglFsKmsSupport.so.5 $USER@$IP:/usr/local/lib/Qt/lib
scp $BASEPATH/qt5/lib/libQt5Quick.so.5 $USER@$IP:/usr/local/lib/Qt/lib
scp $BASEPATH/qt5/lib/libQt5QmlModels.so.5 $USER@$IP:/usr/local/lib/Qt/lib
scp $BASEPATH/qt5/lib/libQt5QmlWorkerScript.so.5 $USER@$IP:/usr/local/lib/Qt/lib

Имя пользователя user и айпишник замените на свои, которые для тестовой машины. Либы копируются только самые необходимые для запуска «HelloWorld», в дальнейшем Вам необходимо будет скопировать остальные.

Дальше нужно снова подключиться к тестовой и обновить список либ:

sudo ldconfig

Переходим обратно на рабочую.

Создаём тестовый проект «Приложение Qt Quick — Пустое»,
комплект выбираем который недавно создали («QOpenGLKMS «).
В *.pro файле дописываем:

INSTALLS        = target
target.path     = /home/user
CONFIG += release

Это что бы запускалось сразу на тестовой машине и релизная версия.

В main.qml

import QtQuick 2.12
import QtQuick.Window 2.12

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Rectangle {
        id: rect1
        property var colors: ["red", "blue", "orange", "gray", "green"]
        property int curColor: 0
        color: colors[curColor]
        anchors.centerIn: parent
        width: 150
        height: 150

        MouseArea {
            anchors.fill: parent
            onClicked: {
                rect1.curColor++;
                if ( rect1.curColor>=rect1.colors.length ) { 
                   rect1.curColor = 0; 
                }
                rect1.color = rect1.colors[rect1.curColor];
            }
        }
    }
}

В настройках проекта обязательно ставим «Release»(Выпуск) сборку.
Ну и запускаем =) На тестовой машине на весь экран должно запуститься приложение.

Возможно, нужно будет поставить драйвера на видюху (хз что она потащит за собой), но навсякий случай если не работает:

sudo su
apt install mesa-utils
apt install ubuntu-drivers-common
ubuntu-drivers autoinstall
apt purge gdm3
reboot

Так же, если не запускается, то на тестовой машинке попробовать прописать:

export QT_LOGGING_RULES=qt.qpa.*=true

Грузится должен qt.qpa.eglfs.kms, если грузится «emu» то проще удалить эту интеграцию: «rm /usr/local/lib/Qt/plugins/egldeviceintegrations/libqeglfs-emu-integration.so»

Так же для диагностики стоит проверить зависимости. На тестовой:

ldd ./myApp

Если все есть, то проверяем зависимости eglfs плагина:

cd /usr/local/lib/Qt/plugins/platforms/
ldd ./libqeglfs.so

Если чего-то нет, гуглим либу и как её ставить (скорее всего из разряда sudo apt isntall lib……, пару раз tab нажмите должен появится список возможных)

И запустить приложение вручную «./myApp» (оно должно быть по пути «target.path» из *.pro файла Вашего приложения при компиляции )

При запуске приложения через ssh подключение вывод будет на тестовой машине, т.е. бегать до тестовой машины всё равно придётся.

Если наблюдаются проблемы с разрешением, или есть несколько видеокарточек (дискретная и встроенная) и выводит не на ту, либо подключено несколько мониторов и нужно вывести на конкретный, то:

cd /dev/dri
ls

В списке смотрим, какие есть видеокарточки, запоминаем.
Что бы указать Qt интеграции, как и через что выводить, содаём конфигурационный файл:

nano /usr/local/lib/Qt/eglfs.json
{
 "device": "/dev/dri/card0",
 "hwcursor": true,
 "pbuffers": true,
 "outputs": [
  {
   "name": "HDMI1", "mode": "1024x768"
  }
 ]
}

Думаю, интуитивно понятно что куда и за что.
Так же полезным будет почитать документацию: https://doc.qt.io/qt-5/embedded-linux.html

Потом на тестовой машине нужно добавить переменную окружения, что бы указать, где файл настроек искать:

sudo su
echo 'QT_QPA_EGLFS_KMS_CONFIG="/usr/local/lib/Qt/eglfs.json"' >> /etc/environment
reboot

Если не работает ввод/курсор, то нужно пользователя добавить в группу input:

sudo usermod -aG input user

Ну а теперь осталось лишь сделать автозапуск приложения при включении. Для этого просто создадим свой systemd сервис:

sudo nano /etc/systemd/system/myApp.service

Description=myApp autostart
Wants=network.target
After=syslog.target network-online.target

[Service]
Type=simple
EnvironmentFile=/etc/environment
ExecStart=/home/user/myApp
Restart=on-failure
RestartSec=10
KillMode=process

[Install]
WantedBy=multi-user.target

Включаем в автозагрузку и запускаем:

sudo systemctl daemon-reload
sudo systemctl enable myApp
sudo systemctl start myApp

Ахтунг! Сервис запускается с рутовыми правами! Как сделать от имени пользователя гугл подскажет, там просто.

Вот как-то так…

Views :

27

Компиляция libav для поддержки h264 видео.

Привет! 

Понадобилось мне в одном из проектов декодировать h264 поток, думал обойдусь без сторонних либ, глянул спеку на 300 страниц и передумал, нашёл библиотеку libav, у которой очень много фич по декодированию аудио и видео. 

Ок, компилируем:

sudo apt-get install libx264-148 libx264-dev #148 замените на актуальную версию
cd ~/Projects/libav
git clone git://git.libav.org/libav.git
./configure --enable-libx264 --enable-gpl --disable-x86asm --enable-shared
make
make install

Вот как-то так, думал будет труднее =)

Views :

114

Android MySql (QMysql) драйвер для Qt5.6 на Windows и Linux компиляция

В общем понадобилось портировать одну прогу под Андроид arm7, но она плотненько работает с базой данных, а так как я человек впринципе ленивый, то обёртку для REST API сервера было лень писать, решился на компилирование MySQL плагина, но если бы я знал тогда, что это займёт у меня 20 часов…
красноглазик

 

В общем вот вам готовый рецепт из 12 шагов для компиляции на Ubuntu и на Windows
То, что помечено windows16 -выполнять только на винде.
Установим инструменты:
1. Качаем и устанавливаем CMake https://cmake.org/download/ у меня 3.5.2
2. Разумеется Android NDK у вас уже должен быть установлен, но вдруг: https://developer.android.com/tools/sdk/ndk/index.html
windows163. Качаем и ставим MSYS https://sourceforge.net/projects/mingw/files/latest/download?source=files (отмечаем всё, что можно)
4. При установке Qt нужно было поставить и исходники (папка qt/5.6/src/qtbase), если нет её, то качаем и ставим
windows165. Открываем консольку MSYS (c:\mingw\msys\1.0\msys.bat), в дальнейшем все действия будут вестись в ней и для удобства выкачивания установим wget:

/c/mingw/bin/mingw-get install msys-wget-bin

1. Создадим отдельную директорию, где будем развлекаться и перейдём в неё:

mkdir /d/Projects/AndroidMySQL
 cd /d/Projects/AndroidMySQL

2. Выкачиваем саму MariaDB, а именно коннектор

wget https://downloads.mariadb.org/interstitial/connector-c-3.0.0/mariadb-connector-c-3.0.0-alpha-src.tar.gz
 tar -xzvf mariadb-connector-c-3.0.0-alpha-src.tar.gz

3. Выкачиваем и распаковываем исходники iconv http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz

wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
 tar -xvzf libiconv-1.14.tar.gz

4. Выкачиваем и распаковываем OpenSSL

wget -c http://www.openssl.org/source/openssl-1.0.1h.tar.gz --no-check-certificate
 tar -xvzf openssl-1.0.1h.tar.gz

5. Задаём общие глобальные переменные
windows16

 export PATH="$PATH:/c/mingw/bin:/c/Program Files (x86)/CMake/bin"
 export ANDROID_NDK_ROOT=/d/Android/android-ndk-r10e
 export SR="$ANDROID_NDK_ROOT"/platforms/android-19/arch-arm/usr # Укажите платформу, под которую собираете ваши проекты (Лучше, 19)
 export BR="$ANDROID_NDK_ROOT"/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64/bin/arm-linux-androideabi-
 export CPP="$BR"cpp
 export AR="$BR"ar
 export STRIP="$BR"strip
 export RANLIB="$BR"ranlib
 export LINKER="$BR"ld
 export OBJDUMP="$BR"objdump
 export CC="$BR"gcc
 export CFLAGS="--sysroot=$SR"
 export CPPFLAGS="$CFLAGS"
 export C_INCLUDE_PATH=$SR/include
 export ANDROID_DEV=$SR/usr
 export MAKEDEPPROG="$CC -M"

6. Собираем сначала iconv

cd libiconv-1.14
 ./configure --host=arm --prefix=$SR/usr --with-sysroot=$SR
 make
 make install

7. Собираем OpenSSL

cd ../openssl-1.0.1h
 CC="$CC -march=armv7-a -mfloat-abi=softfp"
 ./Configure android-armv7 --prefix=$SR/usr no-asm
 make
 make install
 make install_sw

Если заматериться error: undefined reference to ‘__ctype_get_mb_cur_max’,
то в файл libcharset/lib/localcharset.c после дефайнов добавляем

size_t __ctype_get_mb_cur_max(void){
 return 1;
 }

8. Нус, начинаем подготовку к сборке MariaDB

В файл include/my_global.h необходимо добавить определение типа ushort

#ifndef ushort
 #define ushort uint16
 #endif

9. Подготавливаем сборку

cd ../mariadb-connector-c-3.0.0-alpha-src
mkdir build
 cd build
cmake -G "Unix Makefiles"
 -DCMAKE_BUILD_TYPE=Release \
 -DCMAKE_AR="$BR"ar.exe \
 -DCMAKE_C_COMPILER="$BR"gcc.exe \
 -DCMAKE_C_FLAGS=--sysroot=$SR \
 -DCMAKE_LINKER="$BR"ld.exe \
 -DCMAKE_RANLIB="$BR"ranlib.exe \
 -DCMAKE_STRIP="$BR"strip.exe \
 -DCMAKE_SYSTEM_NAME=Linux \
 -DICONV_INCLUDE_DIR="$SR/usr/include" \
 -DICONV_LIBRARIES="$SR/usr/lib/libiconv.a" \
 -DOPENSSL_ROOT_DIR="$SR/usr/lib/" \
 ../

10. Зажмуриваемся и собираем

make


windows16 ага, фиг то там, failed to create symbolic link ‘libmysqlclient.a’: No error
внезапно… тут, похоже, баг самого CMake, поэтому в файле
\AndroidMySQL\mariadb-connector-c-3.0.0-alpha-src\build\libmariadb\CMakeFiles\SYM_libmysqlclient.a.dir\build.make
находим строки (их по две) c -E create_symlink libmariadbclient.a libmysqlclient.a, удаляем её полностью
а так же -E create_symlink libmariadb.so libmysqlclient_r.so аналогично
и вручную копируем и продолжаем сборку

cp libmariadb/libmariadbclient.a libmariadb/libmysqlclient.a
 cp libmariadb/libmariadbclient.a libmariadb/libmysqlclient_r.a
 cp libmariadb/libmariadb.so libmariadb/libmysqlclient.so
 cp libmariadb/libmariadb.so libmariadb/libmysqlclient_r.so
 make



и ещё раз фиг error: unknown type name ‘pthread_mutex_t’
в файле ../unittest/libmariadb/thread.c
находим pthread_t threads[THREAD_NUM]; заменяем на void * threads[THREAD_NUM];
и там же заменяем pthread_mutex_t LOCK_test; на void * LOCK_test;
и опять
make

На этот раз должно всё ок пройти, ну и устанавливаем и копируем к нашему ndk

make install
mkdir "$SR/usr/lib/mariadb"
 mkdir "$SR/usr/include/mariadb/"
 cp libmariadb/*.{a,so} "$SR/usr/lib/mariadb/"
 cp ../include/* "$SR/usr/include/mariadb/"

11. Собираем плагин QMySQL, открываем обычную консольку пути только на свои замените

cd /d/Qt/5.6/Src/qtbase/src/plugins/sqldrivers/mysql/
 /d/Qt/5.6/android_armv7/bin/qmake.exe \
 "INCLUDEPATH+=$SR/usr/include/mariadb" \
 "LIBS+=-L$SR/usr/lib/mariadb -lmariadbclient -lssl -lcrypto -liconv" \
 -o Makefile mysql.pro
make
 make install

12. Разрабатываем тестовый проект
Так как зависит от libmariadb.so, то его необходимо таскать с проектом, для этого в *.pro файле проекта добавить

contains(ANDROID_TARGET_ARCH,armeabi-v7a) {
 ANDROID_EXTRA_LIBS = \
 d:/Projects/AndroidMySQL/mariadb-connector-c-3.0.0-alpha-src/build/libmariadb/libmariadb.so
 }

Пересобираем проект, запускаем, и хуй то там =)
QMYSQL driver not loaded
яоминь
Посмотрим зависимости libqsqlmysql.so, которая в каталоге /home/pavelk/Qt/5.6/android_armv7/plugins/sqldrivers

ldd libqsqlmysql.so

и опять облом, нужна ldd для arm, ладно и с этим разберёмся, например так, тынц.

ldd-avr libqsqlmysql.so

Дело в том, что в зависимостях у libmysql.so есть libmariadb.so.3, а не libmariadb.so
почуяли разницу? =))

В общем, что бы побыстроляну пофиксить
в файле libmariadb/CMakeLists.txt
находим

SOVERSION ${CPACK_PACKAGE_VERSION_MAJOR})

и заменяем на

SOVERSION "so")

ну а дальше удалить полностью build и заново, начиная с 9 шага
troll

!пересобираем! проект, не забыть исправить в pro файле на libmariadb.so.so запускаем и радуемся =)

Итого: сэкономлено куча времени и нервов. Хоть спасибо скажите =))

Views :

1401

ldd на Андроид

После портирования проги на девайс, прога в упор не хотела видеть одну из библиотек, решил глянуть через ldd, что же ей надо, но ldd на Андроиде не оказалось =(, а просто ldd её не воспринимает.

Чтож, будем делать аналог ldd но для arm =)

Вот так:

echo 'readelf -d $1 | grep "\(NEEDED\)" | sed -r "s/.*\[(.*)\]/\1/"' | sudo tee -a /usr/local/bin/ldd-arm
sudo chmod +x /usr/local/bin/ldd-arm

Потом просто

ldd-arm mylib.so

и увидим список либ, от которых зависит наша.

Ну или через стандартную утилиту ndk-depends:

/home/pavelk/Android/android-ndk-r10e/ndk-depends mylib.so

 

Вот как-то так =)

Views :

772

PoDoFo сборка для Qt на Ubuntu 14.10

PoDoFO

PoDoFo это библиотека для чтения и записи PDF файлов.

Для Windows мануал здесь.

Создаём папку, в которой будет идти вся сборка, у меня это ~/Projects/PoDoFO/

Скачиваем саму PoDoFO
Распаковываем файлы архива в папку  podofo-src

Ещё понадобиться LibJpeg
Распаковываем файлы в папку jpeg-9a
Компилируем LibJpeg.
В терминале:

cd ~/Projects/PoDoFo/jpeg-9a/
./configure
make
sudo make install

Так же потребуется LibPng, устанавливаем так:

sudo apt-get install libpng-dev

Теперь, наконец-то, собираем сам PoDoFo

cd  ~/Projects/PoDoFO/podofo-build/
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$HOME/Projects/PoDoFo/lib" ../podofo-src
make
sudo make install

Библиотека скомпилирована! Всё необходимое будет в папке ~/Projects/PoDoFo/lib

Документация по PoDoFo здесь.

Исходники тестового проекта Qt и PoDoFo.

Views :

723

Компиляция и установка OpenCV на Ubuntu для Qt 5.6 c поддержкой ffmpeg, gstreamer

Обновил для Qt 5.14, OpenCV 4.1 и Ubuntu 18.04

Ставим нужные пакеты:

sudo apt update 

sudo apt install build-essential checkinstall git cmake libfaac-dev libjack-jackd2-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libsdl1.2-dev libtheora-dev libva-dev libvdpau-dev libvorbis-dev libx11-dev libxfixes-dev libxvidcore-dev texi2html yasm zlib1g-dev 

sudo apt install libgstreamer1.0-0 libgstreamer1.0-dev gstreamer1.0-tools gstreamer1.0-plugins-base libgstreamer-plugins-base1.0-dev gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-plugins-bad  gstreamer1.0-libav

sudo apt install libgtkglext1 libgtkglext1-dev

Добавим x264 и ffmpeg по вкусу:

sudo apt install nasm
git clone https://code.videolan.org/videolan/x264
cd x264
./configure --enable-shared --enable-pic
make
sudo make install
cd ..
sudo apt-get install libgtk2.0-0 libgtk2.0-dev
sudo apt-get install libjpeg62 libjpeg62-dev libjpeg9 libjpeg9-dev 

git clone https://github.com/FFmpeg/FFmpeg
cd FFmpeg

./configure --enable-gpl --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libx264 --enable-nonfree --enable-postproc --enable-version3 --enable-shared

make
sudo make install
cd ..

Ну и теперь клонируем наш OpenCV, настраиваем:

git clone https://github.com/Itseez/opencv.git OpenCV
cd OpenCV
mkdir build
cd build
export PATH=/home/pavelk/Qt5.14.0/5.14.0/gcc_64/bin:$PATH
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/opencv/ -DWITH_OPENGL=ON -DWITH_QT=ON

В PATH только путь на свой замените.

Выхлоп должен быть примерно таким
— Detected processor: x86_64
— Looking for ccache — not found
— Found ZLIB: /usr/lib/x86_64-linux-gnu/libz.so (found suitable version «1.2.11», minimum required is «1.2.3»)
— Could NOT find TIFF (missing: TIFF_LIBRARY TIFF_INCLUDE_DIR)
— Could NOT find Jasper (missing: JASPER_LIBRARIES JASPER_INCLUDE_DIR)
— Found ZLIB: /usr/lib/x86_64-linux-gnu/libz.so (found version «1.2.11»)
— found Intel IPP (ICV version): 2019.0.0 [2019.0.0 Gold] — at: /home/pavelk/OpenCV/build/3rdparty/ippicv/ippicv_lnx/icv
— found Intel IPP Integration Wrappers sources: 2019.0.0
— at: /home/pavelk/OpenCV/build/3rdparty/ippicv/ippicv_lnx/iw
— Could not find OpenBLAS include. Turning OpenBLAS_FOUND off
— Could not find OpenBLAS lib. Turning OpenBLAS_FOUND off
— Could NOT find Atlas (missing: Atlas_CBLAS_INCLUDE_DIR Atlas_CLAPACK_INCLUDE_DIR Atlas_CBLAS_LIBRARY Atlas_BLAS_LIBRARY Atlas_LAPACK_LIBRARY)
— A library with BLAS API not found. Please specify library location.
— LAPACK requires BLAS
— A library with LAPACK API not found. Please specify library location.
— Could NOT find JNI (missing: JAVA_AWT_LIBRARY JAVA_JVM_LIBRARY JAVA_INCLUDE_PATH JAVA_INCLUDE_PATH2 JAVA_AWT_INCLUDE_PATH)
— VTK is not found. Please set -DVTK_DIR in CMake to VTK build directory, or to VTK install subdirectory with VTKConfig.cmake file
— OpenCV Python: during development append to PYTHONPATH: /home/pavelk/OpenCV/build/python_loader
— Checking for module ‘libavresample’
— No package ‘libavresample’ found
— Checking for module ‘libdc1394-2’
— No package ‘libdc1394-2’ found
— Caffe: NO
— Protobuf: NO
— Glog: NO
— freetype2: YES (ver 21.0.15)
— harfbuzz: YES (ver 1.7.2)
— Could NOT find HDF5 (missing: HDF5_LIBRARIES HDF5_INCLUDE_DIRS) (found version «»)
— Module opencv_ovis disabled because OGRE3D was not found
— No preference for use of exported gflags CMake configuration set, and no hints for include/library directories provided. Defaulting to preferring an installed/exported gflags CMake configuration if available.
— Failed to find installed gflags CMake configuration, searching for gflags build directories exported with CMake.
— Failed to find gflags — Failed to find an installed/exported CMake configuration for gflags, will perform search for installed gflags components.
— Failed to find gflags — Could not find gflags include directory, set GFLAGS_INCLUDE_DIR to directory containing gflags/gflags.h
— Failed to find glog — Could not find glog include directory, set GLOG_INCLUDE_DIR to directory containing glog/logging.h
— Module opencv_sfm disabled because the following dependencies are not found: Eigen Glog/Gflags
— Checking for module ‘tesseract’
— No package ‘tesseract’ found
— Tesseract: NO
— Registering hook ‘INIT_MODULE_SOURCES_opencv_dnn’: /home/pavelk/OpenCV/modules/dnn/cmake/hooks/INIT_MODULE_SOURCES_opencv_dnn.cmake
— opencv_dnn: filter out cuda4dnn source code

— General configuration for OpenCV 4.2.0-dev =====================================
— Version control: 4.2.0-32-gf6ec467f19

— Extra modules:
— Location (extra): /home/pavelk/OpenCV/opencv_contrib/modules
— Version control (extra): 4.2.0-4-g648db235

— Platform:
— Timestamp: 2020-01-03T13:12:12Z
— Host: Linux 5.0.0-37-generic x86_64
— CMake: 3.10.2
— CMake generator: Unix Makefiles
— CMake build tool: /usr/bin/make
— Configuration: Release

— CPU/HW features:
— Baseline: SSE SSE2 SSE3
— requested: SSE3
— Dispatched code generation: SSE4_1 SSE4_2 FP16 AVX AVX2 AVX512_SKX
— requested: SSE4_1 SSE4_2 AVX FP16 AVX2 AVX512_SKX
— SSE4_1 (16 files): + SSSE3 SSE4_1
— SSE4_2 (2 files): + SSSE3 SSE4_1 POPCNT SSE4_2
— FP16 (1 files): + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 AVX
— AVX (5 files): + SSSE3 SSE4_1 POPCNT SSE4_2 AVX
— AVX2 (29 files): + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 FMA3 AVX AVX2
— AVX512_SKX (6 files): + SSSE3 SSE4_1 POPCNT SSE4_2 FP16 FMA3 AVX AVX2 AVX_512F AVX512_COMMON AVX512_SKX

— C/C++:
— Built as dynamic libs?: YES
— C++ Compiler: /usr/bin/c++ (ver 7.4.0)
— C++ flags (Release): -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -msse -msse2 -msse3 -fvisibility=hidden -fvisibility-inlines-hidden -O3 -DNDEBUG -DNDEBUG
— C++ flags (Debug): -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -msse -msse2 -msse3 -fvisibility=hidden -fvisibility-inlines-hidden -g -O0 -DDEBUG -D_DEBUG
— C Compiler: /usr/bin/cc
— C flags (Release): -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Winit-self -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -msse -msse2 -msse3 -fvisibility=hidden -O3 -DNDEBUG -DNDEBUG
— C flags (Debug): -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Winit-self -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -msse -msse2 -msse3 -fvisibility=hidden -g -O0 -DDEBUG -D_DEBUG
— Linker flags (Release): -Wl,—gc-sections
— Linker flags (Debug): -Wl,—gc-sections
— ccache: NO
— Precompiled headers: NO
— Extra dependencies: dl m pthread rt /usr/lib/x86_64-linux-gnu/libGL.so /usr/lib/x86_64-linux-gnu/libGLU.so
— 3rdparty dependencies:

— OpenCV modules:
— To be built: aruco bgsegm bioinspired calib3d ccalib core cvv datasets dnn dnn_objdetect dnn_superres dpm face features2d flann freetype fuzzy gapi hfs highgui img_hash imgcodecs imgproc line_descriptor ml objdetect optflow phase_unwrapping photo plot quality rapid reg rgbd saliency shape stereo stitching structured_light superres surface_matching text tracking ts video videoio videostab xfeatures2d ximgproc xobjdetect xphoto
— Disabled: world
— Disabled by dependency: —
— Unavailable: cnn_3dobj cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev hdf java js matlab ovis python2 python3 sfm viz
— Applications: tests perf_tests apps
— Documentation: NO
— Non-free algorithms: NO

— GUI:
— QT: YES (ver 5.14.0)
— QT OpenGL support: YES (Qt5::OpenGL 5.14.0)
— GTK+: NO
— OpenGL support: YES (/usr/lib/x86_64-linux-gnu/libGL.so /usr/lib/x86_64-linux-gnu/libGLU.so)
— VTK support: NO

— Media I/O:
— ZLib: /usr/lib/x86_64-linux-gnu/libz.so (ver 1.2.11)
— JPEG: /usr/lib/x86_64-linux-gnu/libjpeg.so (ver 90)
— WEBP: build (ver encoder: 0x020e)
— PNG: /usr/lib/x86_64-linux-gnu/libpng.so (ver 1.6.34)
— TIFF: build (ver 42 — 4.0.10)
— JPEG 2000: build (ver 1.900.1)
— OpenEXR: build (ver 2.3.0)
— HDR: YES
— SUNRASTER: YES
— PXM: YES
— PFM: YES

— Video I/O:
— DC1394: NO
— FFMPEG: YES
— avcodec: YES (58.65.102)
— avformat: YES (58.35.101)
— avutil: YES (56.38.100)
— swscale: YES (5.6.100)
— avresample: NO
— GStreamer: YES (1.14.5)
— v4l/v4l2: YES (linux/videodev2.h)

— Parallel framework: pthreads

— Trace: YES (with Intel ITT)

— Other third-party libraries:
— Intel IPP: 2019.0.0 Gold [2019.0.0] — at: /home/pavelk/OpenCV/build/3rdparty/ippicv/ippicv_lnx/icv
— Intel IPP IW: sources (2019.0.0)
— at: /home/pavelk/OpenCV/build/3rdparty/ippicv/ippicv_lnx/iw
— Lapack: NO
— Eigen: NO
— Custom HAL: NO
— Protobuf: build (3.5.1)

— OpenCL: YES (no extra features)
— Include path: /home/pavelk/OpenCV/3rdparty/include/opencl/1.2
— Link libraries: Dynamic load

— Python (for build): /usr/bin/python2.7

— Java:
— ant: NO
— JNI: NO
— Java wrappers: NO
— Java tests: NO

— Install to: /usr/local/opencv
— ——————————————————————

— Configuring done
— Generating done
— Build files have been written to: /home/pavelk/OpenCV/build

наконец-то собираем и ставим:

make -j5
make install
Кстати, «-j5» отвечает за количество потоков сборки, можете увеличить, если больше есть.

Если нужны дополнительные модули, например xfeatures2d для работы со SURF, то нужно их скачать отдельно

cd OpenCV
git clone https://github.com/opencv/opencv_contrib

и в параметры компиляции у cmake добавить:

-DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules
Если какой-либо модуль при сборке будет ебать мозг, то к cmake дописать -DBUILD_opencv_modulename=OFF

Все библиотеки будут в папке /usr/local/opencv/

Простенький пример для Qt Creator: Создаём консольное приложение, в *.pro файл проекта добавляем:

QT += widgets
INCLUDEPATH +="/usr/local/opencv/include/opencv4" 
LIBS += -L"/usr/local/opencv/lib/" 
LIBS += \
   -lopencv_core \ 
   -lopencv_features2d \ 
   -lopencv_highgui \ 
   -lopencv_imgcodecs \ 
   -lopencv_imgproc \ 
   -lopencv_video \ 
   -lopencv_videoio \ 
   -lopencv_videostab
#include <QApplication>

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
using namespace std;
using namespace cv;

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    namedWindow("TestVideo", WINDOW_AUTOSIZE);

    VideoCapture cap("/home/pavelk/bumpy.mp4");

    if ( !cap.isOpened() ) {
        cout << "Cannot open the video file."<<endl;
        return -1;
    }

    while( true ) {
        Mat frame;

        if (!cap.read(frame)) {
            cout<<"Cannot read the video file."<<endl;
            break;
        }

        imshow("TestVideo", frame);

        if( waitKey(30)==27 ) { break; }
    }

    return a.exec();
}

Вот как-то так…

Views :

3713