我正在使用C ++(使用OpenCV)制作一个小应用程序来录制视频,然后让你通过旋转x,y,z中的视图来扭曲它。
现在我开始通过每次迭代旋转一个小角度来测试旋转。虽然视频的显示工作正常,但写入文件却没有。 从代码中我可以看出,我使用纯旋转单应性扭曲每个帧,然后显示和编写扭曲的帧。出于某种原因,即使未扭曲的视频只有几MB大小,扭曲的视频只有几KB,而且它不能使用Ubuntu的标准视频播放器。我最好的猜测是,因为我正在扭曲框架,所以影响框架大小的方式是openCV无法正确保存。我不知道如何修复它。
有什么想法吗?
代码:
//I already recorded the video and saved it into a file called videoName with FPS frames/sec.
VideoCapture video(videoName);
if(!video.isOpened()) {
std::cerr << videoName <<" could not be opened\n";
return -1;
}
namedWindow(videoName, CV_WINDOW_AUTOSIZE);
namedWindow("lol",CV_WINDOW_AUTOSIZE);
std::cout << video.get(CV_CAP_PROP_FPS) << std::endl;
float xTheta = 0;
float yTheta = 0;
string oVideoName = "oVideo.avi";
Size ofSize(video.get(CV_CAP_PROP_FRAME_WIDTH),video.get(CV_CAP_PROP_FRAME_HEIGHT));
VideoWriter vwriter2(oVideoName,CV_FOURCC('D','I','V','X'),FPS,ofSize,true);
if (!vwriter2.isOpened())
{
std::cout << "ERROR: Failed to write the video" << std::endl;
return -1;
}
while(true) {
Mat frame;
bool bSuccess = video.read(frame);
if(!bSuccess || waitKey(1000/FPS) >= 0)
{
std::cout << "END\n";
break;
}
yTheta += 0.00002;
Mat Rx = (Mat_<float>(3,3) << 1,0,0,0,cos(xTheta),-sin(xTheta),0,sin(xTheta),cos(xTheta));
Mat Ry = (Mat_<float>(3,3) << cos(yTheta),0,sin(yTheta),0,1,0,-sin(yTheta),0,cos(yTheta));
Mat H = Rx * Ry;
Mat pFrame(frame.size(),frame.type());
warpPerspective(frame,pFrame,H,frame.size());
imshow("lol", pFrame);
vwriter.write(pFrame);
}
return 0;
答案 0 :(得分:0)
也许你应该读一下如何从this link保存视频文件。此外,您的代码中存在拼写错误。在上面引用的代码的第35行中,它应该是,
vwriter2.write(pFrame);