C ++ read gif | opencv read gif (avec le code complet)

1. Introduction en arrière-plan:
opencv ne peut pas lire directement gif, PIL peut être lu en python, mais en C ++, je ne sais actuellement pas comment utiliser la bibliothèque PIL, et il y a une recommandation d'utiliser FreeImage, mais la documentation incomplète est très gênante, donc Utilisez la méthode suivante pour décoder chaque image de gif et la stocker dans des images. Simple, pratique et efficace!

Deux, le code:
main.cpp

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

int main()
{
    
    
    VideoCapture capture;
    Mat frame;
    frame= capture.open("Gif.gif"); //读取gif文件

    if(!capture.isOpened())
    {
    
    
        printf("can not open ...\n");
        return -1;
    }
    std::vector<cv::Mat> frames;  //存放gif的所有帧,每个frame都是Mat格式
    while (capture.read(frame))
    {
    
    
        std::cout << frame.size() << std::endl;   //打印每一帧的尺寸
        cv::imwrite("demo2.jpg", frame);  //  保存gif的其中一帧便于检查异常
        frames.push_back(frame);
    }
    capture.release();
    return 0;
}

3. Cas d'application: Ce projet est utilisé pour extraire des fonctionnalités à partir d'images. En plus de l'opencv peut lire directement, il existe également opencv ne peut pas lire, comme les fichiers gif, et il peut même y avoir d'autres fichiers qui ne peuvent pas être analysés: ici, Ma logique de traitement est la suivante: utilisez d'abord opencv pour lire, si la lecture est vide, alors il peut s'agir d'un fichier gif, puis utilisez gif pour lire, s'il est toujours vide, aucun traitement n'est effectué. [Gif ici ne prend qu'une image pour l'extraction des fonctionnalités]

Niveau de données de chaque catégorie: opencv peut lire >> gif> autres types divers

 cv::Mat img = cv::imread(image);
 if (img.empty()) {
    
    
    cv::VideoCapture capture;
    cv::Mat imggif;
    imggif = capture.open(image);
    if(!capture.isOpened())
    {
    
    
        json = WriteJsonError(IMAGEERROR);
        return FAILED;
    }
    while (capture.read(imggif))
    {
    
    
        std::cout << img.size() << std::endl;
        img = imggif.clone();
    }
    capture.release();
    if (img.empty()){
    
    
        json = WriteJsonError(IMAGEERROR);
        return FAILED;
    }
    }
    std::vector<float> curfeature = inference->InferSingle(img);

Je suppose que tu aimes

Origine blog.csdn.net/weixin_42699651/article/details/109381159
conseillé
Classement