5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OpenCVAdvent Calendar 2024

Day 22

OpenCVのAVIF/WebP Animationを試そう!

Last updated at Posted at 2024-12-22

この記事はOpenCV Advent Calendar 2024の22日目の記事です。
他の記事は目次にまとめられています。

TL;DR

  • OpeCV 4.11にAnimation WebP Codecsが追加されました!
  • ファイルへ書き出すときはimwriteanimation()関数を使ってください!
  • imwriteanimation()は、WebPもAVIFもサポートしているけど、GIFやAPNGはまだだよ(多分)

はじめに

OpenCVのGIF codecを試してみよう! で述べた通り、GIFフォーマットはLZW特許問題で色々あった…

さて、JPEG形式は今なお絶大なシェアを持つ画像形式ではあるが、これに対抗できるフォーマットについては検討が続いている。その中で、googleが2010年に発表したのが、webpである。そしてその後継としてAVIFも徐々にシェアを伸ばしつつある…。

さて、GSoc 2024として、OpenCVでは、animation画像対応として、前述のGIFに加えて、Animation WebPサポートの検討も行っていた。

ということで、OpenCVのanimationが、2024/12/20に4.x branchにマージされたので、さっそく動かしていきたい!

imwriteanimation()の使い方

ではさっそく、アニメーション生成機能を動かしていく。

なお、公式ドキュメントしか好かん!というかたはこちらを参考ください。
https://docs.opencv.org/4.x/d5/dfb/tutorial_animations.html

// g++ main.cpp -o a.out -I/usr/local/include/opencv4 -lopencv_core -lopencv_imgcodecs -lopencv_imgproc

#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>

int main()
{
  cv::Animation anims;
  cv::Mat logo = imread("opencv-logo-white.png", cv::IMREAD_COLOR);
  for(int i=0; i < 20; i ++ )
  {
    cv::Mat work = logo.clone();
    cv::putText(work,
        cv::format("%d",i),
        cv::Point(40,40),
        cv::FONT_HERSHEY_SIMPLEX,
        1.5,
        cv::Scalar::all(255) );
    anims.frames.push_back( work );
    anims.durations.push_back( 200 /*ms*/ );
  }
  imwriteanimation("output.webp", anims );
  imwriteanimation("output.avif", anims );
  imwriteanimation("output.gif", anims ); // 何も起きない
}

たったこれだけである!!(どどーん!)

  • cv::Animation anims でインスタンスを作る
  • anims.frames.push_back() でイメージを追加
  • anims.durationis.push_back() で更新間隔を追加
  • `imwriteanimation("ファイル名", anims) で出力。ファイル名の拡張子でWEBPにしたりAVIFにしたり

なお、QiitaさんはWebPもAVIFも受け付けてくれなかったので、ファイルは無しでございます・・・

GIF/APNGはおそらくこれからサポート

OpenCVのドキュメント上では、AVIF、WebPだけでなく、GIFやAPNGもサポートに見えるけど、実際はまだ非サポートっぽいですね…

Represents an animation with multiple frames. The Animation struct is designed to store and manage data for animated sequences such as those from animated formats (e.g., GIF, AVIF, APNG, WebP). It provides support for looping, background color settings, frame timing, and frame storage.

GIF Encoderと比べるとどうなの?

今回のGIF Encoderは1frame単位でLZW圧縮しているので、前フレームとの差分とかをとって画像サイズを小さくしていないみたい。

これに対して、libavifやlibwebpなどを使って圧縮するので、より小さいサイズになることが期待できそう!

できれば、こっちを使った方がいいですね・・・

まとめ

  • OpeCV 4.11にAnimation WebP Codecsが追加されました!
  • ファイルへ書き出すときはimwriteanimation()関数を使ってください!
  • imwriteanimation()は、WebPもAVIFもサポートしているけど、GIFやAPNGはまだだよ(多分)
5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?