使用cv::VideoWriter可以创建一个写入对象以便将帧依次输入到一个视频文件中。
以下程序会打开一个视频文件,读取他的内容后将其转换为对数极坐标(log-polar)形式,然后将对数极坐标图像写入一个新的视频文件。
#include#include #include "OpenCamera.h" using namespace cv; using namespace std; int main(int argc, char** argv) { //打开本机的摄像头 //COpenCamera oc; //oc.OpenC(); //读取彩色视频并转换为对数极坐标视频 namedWindow("Example2_11", WINDOW_AUTOSIZE); namedWindow("Log_Polar", WINDOW_AUTOSIZE); //Note: 可以通过给摄像头一个id来读取摄像头的画面 VideoCapture capture("F:/test/Megamind.avi"); double fps = capture.get(CAP_PROP_FPS); Size size( (int)capture.get(CAP_PROP_FRAME_WIDTH), (int)capture.get(CAP_PROP_FRAME_HEIGHT) ); VideoWriter writer; writer.open("F:/test/Megamind-new.avi", CV_FOURCC('M', 'J', 'P', 'G'), fps, size); //新建视频文件 Mat logpolar_frame, bgr_frame; for (;;) { capture >> bgr_frame; if (bgr_frame.empty()) break; //如果成立则程序结束 imshow("Example2_11", bgr_frame); logPolar( bgr_frame, //输入彩色帧 logpolar_frame, //输出对数帧 Point2f( //对数转换的中心点,即设置坐标原点位置 bgr_frame.cols/2, //x bgr_frame.rows/2 //y ), 40, //尺度参数 WARP_FILL_OUTLIERS //用0填充异常值 ); imshow("Log_Polar", logpolar_frame); writer << logpolar_frame; char c = waitKey(10); if (c == 27) break; } capture.release(); }
首先是打开视频并且读取视频的属性(宽、高、帧率)。之后逐帧读取视频,并将每一帧转换为对数极坐标形式,然后将转换的对数极坐标图像写入新的视频文件,循环操作直到源文件读完或者用户按下Esc键。
cv::VideoWriter的调用有几个需要理解的参数。第一个参数是新建视频文件的文件名,第二个是视频编码格式,指明视频将以何种方式进行压缩。本文选择的是通用的MJPG编码器,通过opencv提供的宏CV_FOURCC()指定它。接下来的参数是帧率以及图像的大小,程序中这两个值和原始视频一致。
运行效果图:



