Explicación completa y detallada de la construcción del entorno opencv + ffmpeg (ubuntu)

1. Primero hablemos de la relación entre opencv y ffmpeg.

1.1 La conexión entre ellos.

Sabemos que opencv se usa principalmente para el procesamiento de imágenes, pero también incluye funciones de decodificación de video.En la parte de decodificación de video, opencv usa ffmpeg. Entonces ambos son códecs que pueden procesar imágenes y videos, personalmente siento que el enfoque de los dos es diferente.

1.2 Diferencias entre ellos

Esto es lo que mencioné anteriormente que sus enfoques son diferentes.

OpenCV se centra en el procesamiento de imágenes y aplicaciones de procesamiento relacionadas con imágenes y, en términos generales, puede considerarse como PhotoShop. Opencv realiza principalmente algunas aplicaciones de visión artificial de reconocimiento y seguimiento.

FFmpeg se centra en el procesamiento de codificación, decodificación, conversión, etc. de vídeo y audio. Puede considerarse vagamente como una combinación de Format Factory y PotPlayer. Las principales aplicaciones son la codificación y decodificación y diversas conversiones de formatos.

2. Las versiones de Opencv y ffmpeg coinciden

Antes de construir el entorno, me centré en el problema de hacer coincidir las versiones entre los dos, porque cuando construí el entorno yo mismo, me encontré con demasiados obstáculos debido a la falta de coincidencia de versiones y tenía miedo. Entonces, si maneja bien estos factores de interferencia al principio, puede ahorrarse muchos problemas más adelante.

2.1 ¿Qué problemas pueden ocurrir si las versiones no coinciden?

Habrá varios errores al compilar opencv que no podrán reconocer algunas definiciones, lo que provocará una compilación fallida.

Específicamente:

2.1.1 Pregunta 1

error: 'CODEC_ID_H264' no fue declarado en este ámbito

{CODEC_ID_H264, MKTAG('H', '2', '6', '4') }

La solución dada por los internautas es no habilitar la compilación ffmpeg al compilar:

-D WITH_FFMPEG=OFF 

Lo probé y se puede compilar y pasar, pero al mismo tiempo es como romperse un brazo, lo que trae grandes problemas al uso de la función ffmpeg (clase de procesamiento de video), o simplemente no se puede usar. Por eso creo que la mejor manera es hacer coincidir la versión, compilarla perfectamente y usarla perfectamente, esta es la forma fundamental de usarla con tranquilidad.

2.1.2 Pregunta 2

error: 'CODEC_FLAG_GLOBAL_HEADER' no fue declarado en este ámbito

Esta solución consiste en agregar macros indefinidas. Si no comprende profundamente los principios y mecanismos subyacentes, la mayoría de la gente no pensará en ello y solo los grandes pueden comprender y encontrar este método.

En resumen, el problema es básicamente la coincidencia de las versiones de ffmpeg y opencv, ¿por qué no lo hacemos desde el principio, verdad?

2.2 Cómo saber las versiones coincidentes de ffmpeg y opencv

Para resolver este problema, caminé un largo camino para resolverlo. Puede que al final solo me lleve unas pocas frases, pero el proceso es muy tortuoso, pero es a través de este proceso que me vuelvo más profundo. Al mismo tiempo, también ejercité mi paciencia y fortalecié mi espíritu de investigación, ¡lo cual no está mal! ¡Vayamos al tema!

Ingrese al directorio de código fuente de opencv según el método proporcionado por los internautas

Es lógico que contenga un archivo llamado ffmpeg_version.cmake, que enumerará el número de versión de ffmpeg correspondiente a opencv, similar a la siguiente imagen:

Los números son las versiones correspondientes a cada componente bajo una determinada versión de ffmpeg. Podemos ir al sitio web oficial de ffmpeg para descargar el código fuente de la versión correspondiente de FFmpeg .

La imagen de arriba es solo para ilustrar el problema y no coincide específicamente con el número de versión.

El problema ahora es que no hay ffmpeg_version.cmake en mi archivo. Estaba confundido en ese momento. No hay otra manera, así que abriré ffmpeg.cmake para ver si puedo encontrar alguna pista.

Después de ver el contenido del interior, hay varias pistas, que han sido marcadas en la imagen, aquí hay un resumen:

1. Puede ver la etiqueta correspondiente al número de versión de ffmpeg requerido por opencv, así como el número de identificación de confirmación;

2.ffmpeg.cmake en realidad se descarga desde la URL anterior ***raw.git***;

¿Por qué no se descarga en mi computadora? Después de una serie de consultas, descubrí que no se puede acceder al sitio web. Los internautas también sugirieron agregar IP al archivo host. Mi solución es usar github.com, que en realidad es lo mismo.

Ingrese enlaces adicionales:

GitHub - opencv/opencv_3rdparty: OpenCV - de terceros

Haga clic para entrar

Verá que la identificación de confirmación de opencv también coincide.

Eso es todo. Mucho sobre la coincidencia de versiones. Una vez que comprenda todo el proceso, será mucho más simple. Pero si no lo resuelve paso a paso, no podrá experimentar la ansiedad de encontrar un problema y la sensación de iluminación después de resolver el problema.

El siguiente paso es descargar el código fuente de ffmpeg y opencv respectivamente. El enlace del sitio web oficial de ffmpeg lo proporciona arriba. Lanzamientos: OpenCV es el enlace de descarga del código fuente de opencv. Elija la versión usted mismo. Recuerde que las versiones entre ellas coinciden, de lo contrario Lo regañaré mucho arriba, ¿para qué sirve? Luego compílelo e instálelo y continúe.

3. Proceso de instalación de ffmpeg

Proceso de instalación

Se recomienda instalar ffpmeg primero y luego opencv, porque la instalación de opencv utilizará ffmpeg.

Primero descomprima el código fuente de ffmpeg, luego ingrese al directorio del código fuente e ingrese el siguiente comando:

Hablemos de ello aquí: antes de ingresar el comando, primero instale la biblioteca de soporte.

sudo apt-get install -y autoconf automake build-essential git libass-dev libfreetype6-dev libsdl2-dev libtheora-dev libtool libva-dev libvdpau-dev libvorbis-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev pkg-config texinfo wget zlib1g-dev

Luego ingrese el comando de configuración de parámetros

./configure --disable-x86asm --enable-shared --prefix=/usr/local/ffmpeg

El significado del parámetro es instalar ffmpeg en el directorio /usr/local/ffmpeg y luego ingresarlo una vez completado.

make
中间编译的时间会有点长,依电脑的性能而定
sudo make install

Una vez hecho todo, verá la carpeta ffmpeg en el directorio /usr/local, de la siguiente manera:

Todas las herramientas y bibliotecas dinámicas de ffmpeg están en él. Para encontrar la biblioteca dinámica de ffmpeg durante la compilación, se debe realizar el siguiente procesamiento:

创建文件ffmpeg.conf
sudo vi /etc/ld.so.conf.d/ffmpeg.conf
输入如下内容(ffmpeg动态库的路径)
/usr/local/ffmpeg/lib
最后使能生效
sudo ldconfig

Cuando vea el siguiente contenido, la instalación se realizó correctamente.

Puedes probar usando la herramienta ffplayg para reproducir un video.

/usr/local/ffmpeg/bin/ffplay   **/**/***.mp4 (视频文件目录)

Por supuesto, podemos agregar el bin de ffmpeg a la variable global, para que pueda llamarse en cualquier momento sin agregar una dirección absoluta. Edite el archivo de perfil (sudo vi /etc/profile) y agregue al final del archivo:

export FFMPEG_HOME=/usr/local/ffmpeg 
export PATH=$FFMPEG_HOME/bin:$PATH

La instalación de ffmpeg termina aquí. La siguiente es la instalación de opencv. ¡Continúa!

4. Proceso de instalación de Opencv

Proceso de instalación

De manera similar, descomprima el paquete comprimido opencv, ingrese al directorio del código fuente y cree una carpeta pc_build (si desea usar compilación cruzada en el futuro, simplemente cambie a arm_build, que está demasiado lejos):

Aquí uso cmake para compilar gráficamente, primero instale una herramienta cmake:

sudo apt-get install cmake cmake-qt-gui cmake-curses-gui

Luego ejecute en el directorio pc_build

cmake-gui

Aparece la interfaz

Aquí solo demostramos el entorno ubuntu, no la compilación cruzada.

Haga clic en finalizar, luego haga clic en configurar para configurar algunos parámetros, como se muestra a continuación

Aparece la información de la versión enmarcada en la imagen a continuación, lo que indica que se ha reconocido ffmpeg, ¿qué debo hacer si no se reconoce? Déjalo en suspenso y habla de ello más tarde.

Finalmente haga clic en generar.

pista:

Si encuentra una situación de bloqueo durante el proceso de cmake, faltan archivos que deben descargarse, pero no se pueden descargar.

Por ejemplo: problema de descarga del archivo de instalación del código fuente de opencv: ippicv_2017u3_lnx, face_landmark_model.dat, tiny-dnn

配置:打开${opencv_folder}/3rdparty/ippicv/ippicv.cmake,
第47行  "https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/",
改成:"file://${path}",比如我的就是"file:///home/downloads/"

Dirección de descarga: https://github.com/opencv/opencv_3rdparty/tree/ippicv/

Descarga según la versión que te falta. Si la descarga es lenta, puedes copiar el enlace a Thunder para descargar.

Empezar a compilar

De regreso a la interfaz de comando, no se apresure a escribir make todavía. Primero, agregue la definición de macro #define HAVE_PTHREAD en la línea 33 del archivo 3rdparty/protobuf/src/google/protobuf/stubs/common.cc en el directorio fuente antes de que pueda compilarse. La razón específica es que la macro HAVE_PTHREAD define la biblioteca pthread.

cd ..
// 返回 opencv 源码顶层目录
vi 3rdparty/protobuf/src/google/protobuf/stubs/common.cc

Luego ingrese al directorio pc_build e ingrese el comando

make -j 16
漫长的等待编译编译完之后,安装
sudo make install

Después de todo el éxito, los archivos correspondientes se generarán en el directorio /usr/local.

Contiene archivos de encabezado y bibliotecas dinámicas.

De manera similar, para encontrar la biblioteca dinámica de opencv, realice el siguiente procesamiento

创建文件opencv.conf
sudo vi /etc/ld.so.conf.d/opencv.conf
输入如下内容(ffmpeg动态库的路径)
/usr/local/lib
最后使能生效
sudo ldconfig

¡Ahora la compilación e instalación de opencv está completa!

El hoyo cavado en frente

Un error mencionado anteriormente es qué hacer si la versión de ffmpeg no aparece al ejecutar cmake. Mi enfoque es compilar primero e ignorarlo. Después de pasar la compilación, copie todos los archivos de la PC en el pkgconfig de ffmpeg a /usr/local/ lib/ En pkgconfig, este archivo contiene el archivo pc de opencv.

sudo cp /usr/local/ffmpeg/lib/pkgconfig/*.pc   /usr/local/lib/pkgconfig

Luego vuelva a compilar opencv de acuerdo con la operación anterior. ¿Se bloquea un poco? No hay manera.

Por supuesto, también pensé en algunas operaciones: algunos internautas dijeron que después de instalar ffmpeg, realice las siguientes operaciones y luego compile opencv.

sudo vi /etc/profile
添加
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/ffmpeg/lib/pkgconfig
让环境变量生效
source /etc/profile

Lo manejé así, pero parece inútil. No sé qué pasó. Si algún internauta lo sabe, deje un mensaje para informarle.

Ahora que se han instalado ffmpeg y opencv, no puede contener su entusiasmo y está ansioso por probarlo. A continuación, coge unas cuantas castañas pequeñas y afila tu cuchillo, jajaja.

5. Operación práctica

Es una mula o un caballo que sale a correr. He hecho mucho antes solo para aprender y practicar la operación. A continuación, escribiré algunos pequeños programas para ejecutar la función.

5.1 Mostrar una imagen

#include "opencv2/objdetect.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/opencv.hpp"
#include "opencv2/core/core.hpp"
#include <iostream>

using namespace std;
using namespace cv;

int main(int argc,char** argv)
{
    Mat image = imread("11.png", 1 );//加载
    cv::namedWindow("picture",CV_WINDOW_AUTOSIZE);
    cv::imshow("picture", image);//显示图片
    waitKey(5000);//等待
    return 0;
}

5.2 Reproducir un vídeo

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

int main()
{
	//从摄像头读取视频
	VideoCapture capture("video.mp4");
	//循环显示每一帧
	while (1)
	{
		Mat frame;//定义一个Mat变量,用于存储每一帧的图像
		capture >> frame;//读取当前帧
		imshow("读取视频帧", frame);//显示当前帧
		waitKey(30);//延时30ms
	}

	system("pause");
	return 0;
}

5.3 Utilice la cámara incorporada de la computadora portátil para grabar un video y guardarlo

#include "opencv2/objdetect.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/opencv.hpp"
#include "opencv2/core/core.hpp"
#include <iostream>

using namespace std;
using namespace cv;

int main(int argc,char** argv)
{
//打开电脑摄像头
    VideoCapture capture(0);
      if(!capture.isOpened()){
          cout<<"error"<<endl;
          waitKey(0);
          return 0;
      }
      //获得分辨率
      int w = static_cast<int>(capture.get(CV_CAP_PROP_FRAME_WIDTH));
      int h = static_cast<int>(capture.get(CV_CAP_PROP_FRAME_HEIGHT));
      cout<<"w="<<w<<endl;
      cout<<"h="<<h<<endl;
    
      Size videoSize(w,h);
      VideoWriter writer;
      writer.open("video.mp4",CV_FOURCC('M','J','P','G'),25,videoSize);
      if(!writer.isOpened()){
          cout<<"fail"<<endl;
          return -1;
      }
    
      Mat frame;
      int key;
      char startorstop=1;
      char flag=0;
      while(1){
        capture >> frame;
        if(key == 32){//按下空格开始录制、暂停录制   可以来回切换
            startorstop = 1-startorstop;
            if(startorstop == 0){
                flag = 1;
            }
        }
        if(key == 27){//按下ESC退出整个程序,保存视频文件到磁盘
            cout << "exit" << endl;
            break;
        }
        if(startorstop == 0 && flag == 1){
            writer << frame;
            cout << "recording" << endl;
        }else if(startorstop == 1){
            flag = 0;
            cout << "end recording" << endl;
        }
        imshow("picture",frame);
        key=waitKey(100);
        cout<<"key="<<key<<endl;
      }
      capture.release();
      writer.release();
      destroyAllWindows();
      return 0;
}

compilar script

g++ test.cpp -o test -L/usr/local/lib -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_videoio -lopencv_imgcodecs

Bueno, esto llega a su fin, he pisado la mayoría de los hoyos que siento que tengo que pisar en el camino, ¡no es fácil! ¡Así que siéntete libre de usar tu creatividad en el camino que tienes por delante!

Si hay algún error, ¡corríjame!

Supongo que te gusta

Origin blog.csdn.net/Damon_Sandy/article/details/131995799
Recomendado
Clasificación