读取本地视频或者摄像头采集的视频,并将彩色视频转换为对数极坐标视频(视频处理),保存处理后的视频。
#include <opencv2/opencv.hpp>
#include <iostream>
int main(int argc, char* argv[]) {
cv::String inputFileName = "D:\\Code files\\Video_example.mp4"; //本地输入视频的路径
cv::String outputFileName = "D:\\Code files\\output_video.mp4"; //输出视频的路径
cv::VideoCapture capture;
if (inputFileName != ""){
capture.open(inputFileName); //若本地输入视频路径不为空,则读入本地视频
}
else{
capture.open(0); //否则,打开摄像头读取视频
}
//若本地视频或摄像头视频都读入失败,则抛出错误提示
if (!capture.isOpened()) {
std::cerr << "Could't open capture." << std::endl;
return -1;
}
cv::namedWindow("原视频", cv::WINDOW_AUTOSIZE);
cv::namedWindow("Log_Polar", cv::WINDOW_AUTOSIZE);
double fps = capture.get(cv::CAP_PROP_FPS); //获取视频的帧率
//获取视频的尺寸宽、高
cv::Size size((int)capture.get(cv::CAP_PROP_FRAME_WIDTH), (int)capture.get(cv::CAP_PROP_FRAME_HEIGHT));
cv::VideoWriter writer;
writer.open(outputFileName, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'), fps, size); //选择通用的MJPG编码器
cv::Mat logpolar_frame, bgr_frame;
for (;;) {
capture >> bgr_frame; //输入流操作符重载,从VideoCapture对象中读取下一帧数据
if (bgr_frame.empty()) break; // end if done
cv::imshow("原视频", bgr_frame);
//将每一帧彩色视频转换为对数极坐标(log-polar)视频
cv::logPolar(
bgr_frame, // Input color frame
logpolar_frame, // Output log-polar frame
cv::Point2f( bgr_frame.cols / 2, bgr_frame.rows / 2 ), // 对数极坐标变换的中心点 (x, y)
40, // Magnitude (scale parameter)
cv::WARP_FILL_OUTLIERS // Fill outliers with 'zero'
);
cv::imshow("Log_Polar", logpolar_frame);
writer << logpolar_frame; //输出流操作符重载,从VideoWriter对象中写入一帧数据
char c = cv::waitKey(10);
if (c == 27) break; // 按Esc键可主动结束
}
capture.release();
cv::destroyAllWindows();
return 0;
}