- 操作系統: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;
}