OpenCV:录制扭曲的视频

Posted

技术标签:

【中文标题】OpenCV:录制扭曲的视频【英文标题】:OpenCV: Recording a Warped Video 【发布时间】:2013-10-23 09:40:06 【问题描述】:

我正在用 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;

【问题讨论】:

【参考方案1】:

也许您应该了解一下如何从this link 保存视频文件。此外,您的代码中存在拼写错误。在上面引用的代码的第35行中,应该是,

vwriter2.write(pFrame);

【讨论】:

以上是关于OpenCV:录制扭曲的视频的主要内容,如果未能解决你的问题,请参考以下文章

openCV录制视频

在 opencv 中录制视频仅 30 秒

在android中使用OpenCV录制视频

opencv for android(十六):opencv在android上的录制avi格式的视频

在 Tkinter 主循环期间录制 OpenCV 视频

使用 opencv 和 Qt 录制视频