- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
cv::detail::Timelapser 是 OpenCV 库中用于实现图像拼接过程中的时间流逝(timelapse)效果的一个类。它通常用于将一系列的图像或视频帧组合成一个平滑过渡的序列,常应用于延时摄影(time-lapse photography)或者视频合成等领域。
这个类的主要作用是管理图像拼接的过程,并提供一种方法来创建不同类型的 Timelapser 实例,以适应不同的需求和场景。
主要成员函数
-
createDefault(): 静态成员函数,用于创建一个默认类型的 Timelapser 对象。根据传入的参数类型,可以生成不同策略的时间流逝实例。
-
apply(): 应用当前的拼接设置到输入图像上,生成拼接结果。该函数可能有不同的重载形式,以支持不同类型的操作和输入。
代码示例
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/stitching/detail/timelapsers.hpp>
#include <vector>
using namespace cv;
using namespace cv::detail;
using namespace std;
int main()
{
// 图像文件列表
vector< String > img_names = { "/media/dingxin/data/study/OpenCV/sources/images/lapsetimer1.png", "/media/dingxin/data/study/OpenCV/sources/images/lapsetimer2.png",
"/media/dingxin/data/study/OpenCV/sources/images/lapsetimer3.png" };
vector< Mat > imgs;
// 加载所有图像
for ( const auto& name : img_names )
{
Mat img = imread( name, IMREAD_COLOR ); // 确保以彩色模式读取图像
if ( img.empty() )
{
cout << "无法加载图像: " << name << endl;
return -1;
}
imgs.push_back( img );
}
// 创建Timelapser实例
Ptr< Timelapser > timelapser = Timelapser::createDefault( Timelapser::AS_IS );
// 初始化Timelapser,假设所有图像具有相同的尺寸
Size dst_size = imgs[ 0 ].size();
vector< Point > corners; // 每个图像对应的角落位置
vector< Size > sizes; // 每个图像的尺寸
for ( size_t i = 0; i < imgs.size(); ++i )
{
corners.push_back( Point( 0, 0 ) ); // 假设每个图像都在左上角
sizes.push_back( dst_size ); // 所有图像具有相同的尺寸
}
timelapser->initialize( corners, sizes );
// 处理每张图像
for ( size_t i = 0; i < imgs.size(); ++i )
{
Mat img_converted;
imgs[ i ].convertTo( img_converted, CV_16SC3 ); // 将图像转换为16位深度、三通道的短整型格式
timelapser->process( img_converted, noArray(), Point( 0, 0 ) ); // 使用noArray()作为mask,假设不需要掩码
// 获取当前帧的结果
UMat result_umat = timelapser->getDst();
Mat result;
result_umat.copyTo( result ); // 将UMat转换为Mat以便显示或保存
Mat restoredImageMat;
result.convertTo( restoredImageMat, CV_8U ); // 如果需要的话,调整数据类型以适应显示
imshow( "Current Frame", restoredImageMat );
waitKey( 300 ); // 暂停一段时间以便观察每一帧
}
// 获取最终拼接结果
UMat final_result_umat = timelapser->getDst();
Mat final_result;
final_result_umat.copyTo( final_result );
imwrite( "final_timelapse.jpg", final_result );
cout << "时间流逝视频的最后一帧已保存为 final_timelapse.jpg" << endl;
return 0;
}