GNU/Linux >> Tutoriales Linux >  >> Linux

Configurar y compilar OpenCV para una instalación personalizada de FFMPEG

Han pasado años después de que se hizo la pregunta, pero recientemente me encontré con el tipo de problemas descritos en esta pregunta. Me gustaría agregar mi entrada.

Primero:solo construí las bibliotecas ffmpeg estáticas (por razones), a las que el proceso de compilación opencv es algo hostil. Ha habido publicaciones de desarrolladores de opencv que afirman que no admiten una compilación de opencv contra bibliotecas ffmpeg estáticas, pero mi pensamiento fue "¿y si también está creando bibliotecas de opencv estáticas? Ciertamente, eso debería ser compatible".

Y la respuesta es , puede compilar bibliotecas opencv estáticas contra bibliotecas ffmpeg estáticas. Hice esto con opencv 4.1.1 contra ffmpeg 4.2. Tuve que usar las siguientes opciones de cmake:

cmake3 \
-D BUILD_opencv_apps=OFF \
-D BUILD_opencv_python2=OFF \
-D BUILD_SHARED_LIBS=OFF \
-D WITH_FFMPEG=ON \
-D OPENCV_FFMPEG_SKIP_BUILD_CHECK=ON \

Estas opciones dan como resultado un conjunto de bibliotecas estáticas opencv que incluyen cualquier biblioteca estática ffmpeg que también haya creado, suponiendo que su PKG_CONFIG_PATH esté configurado para encontrar correctamente esas bibliotecas (o si las ha instalado en alguna ubicación predeterminada del sistema).

P/R:

  • ¿Por qué no podemos crear aplicaciones?
    • El proceso de compilación de opencv asume que está compilando y vinculando bibliotecas compartidas, incluso si solo compila bibliotecas estáticas. Esto parece más una deficiencia en el proceso de construcción que una limitación técnica; quizás algún día esto se arregle.
  • ¿Qué es el indicador OPENCV_FFMPEG_SKIP_BUILD_CHECK?
    • Hay un paso en el proceso cmake de ffmpeg en el que se compila y vincula una aplicación utilizando el mismo proceso de compilación defectuoso que las otras aplicaciones de opencv. Es defectuoso en el sentido de que el proceso asume que se está vinculando con bibliotecas compartidas cuando no es necesario; puede realizar los mismos pasos de compilación usted mismo mientras no haciendo esa suposición y crear una aplicación de trabajo. Por lo tanto, esta verificación de compilación debe desactivarse para que opencv acepte que sí, de hecho, cualquier biblioteca estática que encuentre está bien para usar. esto es
  • ¿Y por qué deshabilitas la compatibilidad con Python?
    • El proceso de compilación de opencv python produce explícitamente una biblioteca compartida cargable por Python.
  • ¿Esto implica que todavía está creando el conjunto de pruebas incluso con las bibliotecas estáticas?
    • Sí. Pero no he intentado ejecutarlos

Algo como

export LD_LIBRARY_PATH=/ffmpeg_install_path/lib/
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/ffmpeg_install_path/lib/pkgconfig
export PKG_CONFIG_LIBDIR=$PKG_CONFIG_LIBDIR:/ffmpeg_install_path/lib/

Deberia trabajar. Al menos funciona para OpenCV 2.4.x en mi Ubuntu.


Para OpenCV 3.x y ffmpeg 3.x, debo aplicar el siguiente parche

diff --git a/cmake/OpenCVFindLibsVideo.cmake b/cmake/OpenCVFindLibsVideo.cmake
index 13b62ac..bab9df3 100644
--- a/cmake/OpenCVFindLibsVideo.cmake
+++ b/cmake/OpenCVFindLibsVideo.cmake
@@ -228,6 +228,12 @@ if(WITH_FFMPEG)
     if(FFMPEG_libavresample_FOUND)
       ocv_append_build_options(FFMPEG FFMPEG_libavresample)
     endif()
+   CHECK_MODULE(libavcodec HAVE_FFMPEG)
+   CHECK_MODULE(libavformat HAVE_FFMPEG)
+   CHECK_MODULE(libavutil HAVE_FFMPEG)
+   CHECK_MODULE(libswscale HAVE_FFMPEG)
+   CHECK_MODULE(libswresample HAVE_FFMPEG)
+   CHECK_MODULE(libavresample HAVE_FFMPEG)
     if(HAVE_FFMPEG)
       try_compile(__VALID_FFMPEG
           "${OpenCV_BINARY_DIR}"

Y con el siguiente script para construir

#!/bin/bash

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/Applications/ffmpeg/lib
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$HOME/Applications/ffmpeg/lib/pkgconfig
export PKG_CONFIG_LIBDIR=$PKG_CONFIG_LIBDIR:$HOME/Applications/ffmpeg/lib

cmake \
    -D BUILD_EXAMPLES=ON \
    -D BUILD_TESTS=OFF \
    -D OPENCV_EXTRA_EXE_LINKER_FLAGS="-Wl,-rpath,$HOME/Applications/ffmpeg/lib" \
    -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=$HOME/Applications/opencv \
    /path/to/opencv

Además, cuando construyo ffmpeg, tengo que habilitar las banderas --enable-avresample .


Linux
  1. Cómo instalar y configurar VSFTPD

  2. Cómo instalar y configurar Postfix

  3. ¿Cómo instalar y configurar Fail2ban en Ubuntu?

  4. Instalar IIS y configurar un sitio web

  5. Cómo instalar y configurar Elasticsearch en Ubuntu 18.04

Cómo instalar y configurar Grafana

Instalar y configurar Fail2ban en Debian 11

Cómo instalar y configurar Memcached en CentOS 8

Instalar y configurar DRBD en CentOS 8

Cómo instalar y configurar Parse Server en Ubuntu 20.04

Instalar y configurar phpMyAdmin