2013-10-23 51 views
0

我正在用C++(使用OpenCV)制作一个小应用程序,用于录制视频,然后让您通过在x,y,z中旋转视图来扭曲它。OpenCV:录制扭曲的视频

现在我刚开始测试旋转,使其每次迭代旋转一个小角度。虽然视频的显示效果很好,但写入文件却没有。 从代码中我可以看到,我使用纯旋转单应变形来扭曲每个帧,然后显示和写入变形帧。由于某些原因,即使未扭曲的视频只有几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

也许你应该阅读了关于如何将视频文件从this link节省一点。此外,您的代码中存在拼写错误。在线35上面引用的代码的,它应该是,

vwriter2.write(pFrame);