OpenCV
开源计算机视觉库
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
处理动画图像文件

原作者Suleyman Turkmen(在ChatGPT的帮助下)
兼容性OpenCV >= 4.11

目标

在本教程中,您将学习如何:

源代码

说明

初始化 Animation 结构体

初始化一个 cv::Animation 结构体以保存来自动画图像文件的帧。

Animation animation;

加载帧

使用 cv::imreadanimation 从指定文件加载帧。在这里,我们从动画 WebP 图像中加载所有帧。

bool success = imreadanimation(filename, animation);
if (!success) {
std::cerr << "Failed to load animation frames\n";
return -1; -1;
}

显示帧

animation.frames 向量中的每一帧都可以作为独立图像显示。此循环遍历每一帧,并在窗口中显示它,并带有短暂的延迟以模拟动画。

}
while (true)
for (size_t i = 0; i < animation.frames.size(); ++i) {
imshow("Animation", animation.frames[i]);
int key_code = waitKey(animation.durations[i]); // 帧间延迟
if (key_code == 27)
}

保存动画

if (argc == 1)
{
Animation animation_to_save;
Mat image(128, 256, CV_8UC4, Scalar(150, 150, 150, 255));
int duration = 200;
for (int i = 0; i < 10; ++i) {
animation_to_save.frames.push_back(image.clone());
putText(animation_to_save.frames[i], format("第 %d 帧", i), Point(30, 80), FONT_HERSHEY_SIMPLEX, 1.5, Scalar(255, 100, 0, 255), 2);
animation_to_save.durations.push_back(duration);
}
imwriteanimation("animated_image.webp", animation_to_save, { IMWRITE_WEBP_QUALITY, 100 });
}

总结

cv::imreadanimationcv::imwriteanimation 函数简化了动画图像文件的处理,通过将帧加载到 cv::Animation 结构体中,从而实现逐帧处理。使用这些函数,您可以加载、处理和保存来自 GIF、AVIF、APNG 和 WebP 等动画图像文件的帧。