Explication complète et détaillée de la construction de l'environnement opencv+ffmpeg (ubuntu)

1. Parlons d'abord de la relation entre opencv et ffmpeg

1.1 Le lien entre eux

On sait qu'opencv est principalement utilisé pour le traitement d'images, mais il inclut également des fonctions de décodage vidéo. Dans la partie décodage vidéo, opencv utilise ffmpeg. Ce sont donc tous deux des codecs capables de traiter des images et des vidéos. Personnellement, je pense que l’objectif des deux est différent.

1.2 Différences entre eux

C'est ce que j'ai mentionné ci-dessus : leurs objectifs sont différents.

OpenCV se concentre sur le traitement des images et les applications de traitement liées aux images. Il peut être vaguement considéré comme PhotoShop. Opencv réalise principalement des applications de reconnaissance et de suivi de vision industrielle.

FFmpeg se concentre sur le traitement de l'encodage, du décodage, de la conversion, etc. vidéo et audio. Il peut être vaguement considéré comme une combinaison de Format Factory et PotPlayer. Les principales applications sont l'encodage et le décodage ainsi que diverses conversions de formats.

2. Les versions Opencv et ffmpeg correspondent

Avant de créer l'environnement, je me suis concentré sur le problème de la correspondance des versions entre les deux, car lorsque j'ai construit l'environnement moi-même, j'ai rencontré trop de pièges en raison de la non-concordance des versions et j'avais peur. Ainsi, si vous gérez correctement ces facteurs d’interférence au début, vous pouvez éviter bien des ennuis plus tard.

2.1 Quels problèmes peuvent survenir si les versions ne correspondent pas ?

Il y aura diverses erreurs lors de la compilation d'opencv et certaines définitions ne pourront pas être reconnues, ce qui entraînera un échec de compilation.

Spécifiquement:

2.1.1 Question 1

erreur : 'CODEC_ID_H264' n'a pas été déclaré dans cette portée

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

La solution proposée par les internautes est de ne pas activer la compilation ffmpeg lors de la compilation :

-D WITH_FFMPEG=OFF 

Je l'ai essayé et il peut être compilé et transmis, mais en même temps, c'est comme se casser un bras, ce qui pose d'énormes problèmes à l'utilisation de la fonction ffmpeg (classe de traitement vidéo), ou ne peut tout simplement pas être utilisé. Je pense donc que le meilleur moyen est de faire correspondre la version, de la compiler parfaitement et de l'utiliser parfaitement. C'est la manière fondamentale de l'utiliser en toute sérénité.

2.1.2 Question 2

erreur : 'CODEC_FLAG_GLOBAL_HEADER' n'a pas été déclaré dans cette portée

Cette solution consiste à ajouter des macros non définies. Si vous ne comprenez pas profondément les principes et les mécanismes sous-jacents, la plupart des gens n'y penseront pas, et seuls les grands peuvent comprendre et trouver cette méthode.

Bref, le problème est essentiellement la correspondance des versions ffmpeg et opencv. Pourquoi ne le faisons-nous pas dès le début, n'est-ce pas ?

2.2 Comment connaître les versions correspondantes de ffmpeg et opencv

Afin de résoudre ce problème, j'ai parcouru un long chemin pour le comprendre. Cela ne prend peut-être que quelques phrases au final, mais le processus est très tortueux, mais c'est à travers ce processus que je deviens plus profond. temps, j'ai aussi exercé ma patience et renforcé mon esprit de recherche, ce qui n'est pas mal ! Venons-en au sujet !

Entrez le répertoire du code source opencv selon la méthode fournie par les internautes

Il va de soi qu'il devrait contenir un fichier appelé ffmpeg_version.cmake, qui répertoriera le numéro de version de ffmpeg correspondant à opencv, similaire à l'image ci-dessous :

Ceux avec des numéros sont les versions correspondant à chaque composant sous une certaine version de ffmpeg. Nous pouvons aller sur le site officiel de ffmpeg pour télécharger la version correspondante du code source de FFmpeg .

L'image ci-dessus sert simplement à illustrer le problème et ne correspond pas spécifiquement au numéro de version.

Le problème maintenant est qu'il n'y a pas de ffmpeg_version.cmake dans mon fichier. J'étais confus à l'époque. Il n'y a pas d'autre moyen, je vais donc ouvrir ffmpeg.cmake pour voir si je peux trouver des indices.

Après avoir vu le contenu à l'intérieur, il y a plusieurs indices, qui ont été marqués sur l'image. Voici un résumé :

1. Vous pouvez voir la balise tag correspondant au numéro de version ffmpeg requis par opencv, ainsi que le numéro d'identification du commit ;

2.ffmpeg.cmake est en fait téléchargé à partir de l'URL ci-dessus ***raw.git*** ;

Pourquoi n'est-il pas téléchargé sur mon ordinateur ? Après une série de recherches, j'ai constaté que le site Web n'était pas accessible. Les internautes ont également suggéré d'ajouter une adresse IP au fichier hôte. Ma solution consiste à utiliser github.com à la place, ce qui est en fait le même.

Entrez des liens supplémentaires :

GitHub - opencv/opencv_3rdparty : OpenCV - tiers

Cliquez pour entrer

Vous constaterez que l’identifiant de commit d’opencv correspond également.

C'est ça. Voilà pour la correspondance des versions. Une fois que vous aurez compris l'ensemble du processus, ce sera beaucoup plus simple. Mais si vous ne le comprenez pas étape par étape, vous ne pourrez pas ressentir l'anxiété de rencontrer un problème et le sentiment de illumination après avoir résolu le problème. .

L'étape suivante consiste à télécharger respectivement le code source de ffmpeg et d'opencv. Le lien vers le site officiel de ffmpeg est fourni ci-dessus. Versions - OpenCV est le lien de téléchargement du code source d'opencv. Choisissez vous-même la version. N'oubliez pas que les versions entre elles correspond, sinon je vais harceler tellement plus haut. A quoi ça sert ? Ensuite, compilez-le et installez-le, et continuons.

3. Processus d'installation de ffmpeg

Processus d'installation

Il est recommandé d'installer d'abord ffpmeg, puis opencv, car l'installation d'opencv utilisera ffmpeg.

Décompressez d'abord le code source de ffmpeg, puis entrez dans le répertoire du code source et entrez la commande suivante :

Parlons-en ici. Avant de saisir la commande, installez d'abord la bibliothèque de support.

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

Entrez ensuite la commande de configuration des paramètres

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

La signification du paramètre est d'installer ffmpeg dans le répertoire /usr/local/ffmpeg, puis de le saisir une fois terminé

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

Une fois que tout est terminé, vous verrez le dossier ffmpeg dans le répertoire /usr/local, comme suit :

Les outils et bibliothèques dynamiques de ffmpeg sont tous dedans. Afin de trouver la bibliothèque dynamique de ffmpeg lors de la compilation, le traitement suivant doit être effectué :

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

Lorsque vous voyez le contenu suivant, l'installation est réussie.

Vous pouvez tester en utilisant l'outil ffplayg pour lire une vidéo

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

Bien sûr, on peut ajouter le bin de ffmpeg à la variable globale, afin qu'elle puisse être appelée à tout moment sans ajouter d'adresse absolue. Editez le fichier de profil (sudo vi /etc/profile) et ajoutez à la fin du fichier :

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

L'installation de ffmpeg se termine ici. Vient ensuite l'installation d'opencv. Continuez !

4. Processus d'installation d'Opencv

Processus d'installation

De même, décompressez le package compressé opencv, entrez dans le répertoire du code source et créez un dossier pc_build (si vous souhaitez utiliser la compilation croisée à l'avenir, passez simplement à arm_build, qui est trop loin) :

Ici, j'utilise cmake pour compiler graphiquement. Installez d'abord un outil cmake :

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

Puis exécutez-le dans le répertoire pc_build

cmake-gui

L'interface apparaît

Ici, nous démontrons uniquement l'environnement Ubuntu, pas la compilation croisée.

Cliquez sur Terminer, puis cliquez sur configurer pour configurer certains paramètres, comme indiqué ci-dessous

Les informations de version encadrées dans l'image ci-dessous apparaissent, indiquant que ffmpeg a été reconnu. Que dois-je faire s'il n'est pas reconnu ? Laissez-le en suspens et parlez-en plus tard.

Enfin, cliquez sur générer.

indice:

Si vous rencontrez une situation bloquée pendant le processus cmake, il manque des fichiers qui doivent être téléchargés, mais ils ne peuvent pas être téléchargés.

Par exemple : problème de téléchargement du fichier d'installation du code source 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/"

Adresse de téléchargement : https://github.com/opencv/opencv_3rdparty/tree/ippicv/

Téléchargez en fonction de la version qui vous manque. Si le téléchargement est lent, vous pouvez copier le lien vers Thunder pour télécharger.

Commencez à compiler

De retour à l’interface de commande, ne vous précipitez pas pour taper make. Tout d'abord, ajoutez la définition de la macro #define HAVE_PTHREAD à la ligne 33 du fichier 3rdparty/protobuf/src/google/protobuf/stubs/common.cc dans le répertoire du code source avant de pouvoir le compiler. La raison spécifique est que la macro HAVE_PTHREAD définit la bibliothèque pthread.

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

Entrez ensuite dans le répertoire pc_build et entrez la commande

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

Après tout succès, les fichiers correspondants seront générés dans le répertoire /usr/local.

Il contient des fichiers d'en-tête et des bibliothèques dynamiques

De même, afin de trouver la bibliothèque dynamique d'opencv, effectuez le traitement suivant

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

La compilation et l'installation d'opencv sont maintenant terminées !

Le trou creusé devant

Un écueil mentionné précédemment est que faire si la version de ffmpeg n'apparaît pas lors de l'exécution de cmake. Mon approche consiste à compiler d'abord et à l'ignorer. Une fois la compilation réussie, copiez tous les fichiers PC dans le pkgconfig de ffmpeg dans /usr/local/ lib/ Dans pkgconfig, ce fichier contient le fichier pc d'opencv.

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

Ensuite, recompilez opencv selon l'opération ci-dessus. Est-ce qu'il plante un peu ? Il n'y a aucun moyen.

Bien sûr, j'ai aussi pensé à certaines opérations : certains internautes ont dit qu'après avoir installé ffmpeg, effectuez les opérations suivantes, puis compilez opencv.

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

Je l'ai géré comme ça, mais cela semble inutile. Je ne sais pas ce qui s'est passé. Si des internautes le savent, veuillez laisser un message pour le leur faire savoir.

Maintenant que ffmpeg et opencv ont été installés, vous ne pouvez pas retenir votre enthousiasme et avez hâte de l'essayer. Ensuite, prenez quelques petites châtaignes et aiguisez votre couteau, hahaha.

5. Fonctionnement pratique

C'est un mulet ou un cheval qui sort pour courir. J'ai fait tellement de choses auparavant juste pour apprendre et pratiquer le fonctionnement. Ensuite, j'écrirai quelques petits programmes pour exécuter la fonction.

5.1 Afficher une image

#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 Lire une vidéo

#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 Utilisez la caméra intégrée de l'ordinateur portable pour filmer une vidéo et l'enregistrer

#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;
}

compiler le script

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

Bon, ça s'arrête ici, j'ai marché sur la plupart des fosses sur lesquelles je sens que je dois marcher en cours de route, ce n'est pas facile ! Alors n’hésitez pas à utiliser votre créativité sur la route à venir !

S'il y a des erreurs, corrigez-moi !

Je suppose que tu aimes

Origine blog.csdn.net/Damon_Sandy/article/details/131995799
conseillé
Classement