0

ビデオを記録し、x、y、z でビューを回転させてワープできるようにする小さなアプリケーションを C++ (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;
4

1 に答える 1

0

このリンクから動画ファイルを保存する方法を少し読んでおく必要があるかもしれません。また、コードにタイプミスがあります。上記の引用コードの35 行目では、次のようになります。

vwriter2.write(pFrame);

于 2013-10-23T11:49:28.300 に答える