この記事は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はまだだよ(多分)