2017-09-10 20 views
1

カメラを使用してビデオを保存するにはVideoWriter(もちろんVideoCapture)クラスを使用しようとしています。 10秒を超えると、最後の10秒が出力ファイルに保存されます。コードにはVideoWriterのインスタンスが2つあります。私はチャンネル数が3であると確信しています(C++)OpenCV VideoWriterアサーションに失敗しましたimg.cols == width && img.rows == height * 3

void main() 
{ 
    VideoCapture vdc(0); 
    VideoWriter vw("REC.avi", CV_FOURCC('M', 'J', 'P', 'G'), 100.0, Size(vdc.get(CAP_PROP_FRAME_WIDTH), vdc.get(CAP_PROP_FRAME_HEIGHT)),true); 
    VideoWriter vw1("REC2.avi", CV_FOURCC('M', 'J', 'P', 'G'), 100.0, Size(vdc.get(CAP_PROP_FRAME_WIDTH), vdc.get(CAP_PROP_FRAME_HEIGHT)),true); 
    char cmd = 'a'; 
    Mat frm; 
    DWORD st, ed; 
    st = GetTickCount(); 
    while (cmd != 27 && vdc.isOpened()) 
    { 
     vdc >> frm; 
     vw << frm; 
     vw1 << frm; 
     imshow("Camera", frm); 
     cmd = waitKey(10); 
    } 
    ed = GetTickCount(); 
    destroyAllWindows(); 
    cout << ed - st << endl; 
    vdc.release(); 
    vw.release(); 
    vw1.release(); 
    if (ed - st > 10000) 
    { 
     VideoCapture vdc2("REC2.avi"); 
     VideoWriter vw2("REC.avi", CV_FOURCC('M', 'J', 'P', 'G'), 100.0, Size(vdc2.get(CAP_PROP_FRAME_WIDTH), vdc2.get(CAP_PROP_FRAME_HEIGHT)),true); 
     DWORD st2, ed2; 
     st2 = getTickCount(); 
     Mat frame; 
     while (vdc2.isOpened()) 
     { 
      ed2 = getTickCount(); 
      vdc2 >> frame; 
      if (ed2 - st2 > ed - st - 10000) 
      { 
       vw2 << frame; 
       waitKey(10); 
       if (vw2.get(CAP_PROP_POS_AVI_RATIO) == 1)break; 
      } 
     } 
    } 
} 

と私は何の問題も会っていない。ここで OpenCV Error: Assertion failed (img.cols == width && img.rows == height*3) in cv::mjpeg::MotionJpegWriter::write, file C:\build\master_winpack-build-win64- vc14\opencv\modules\videoio\src\cap_mjpeg_encoder.cpp, line 842

が私のコードです:実行している場合しかし、私は常に、コンソールウィンドウに次のエラーを得ましたvw(実際にはREC2.aviは正常に開くことができますが、REC.aviでは開けません)。
私はWin20でVS2017とOpenCVの最新バージョンを使用します。
私はOpenCVの完全な初心者であり、試してみるべきことがありません。

+0

ソースコードのどのラインでOpenCVでアサーションを取得できますか? –

+0

次の行にあります: 'vw2 << frame' –

+0

これをチェックしてください。 [リンク。](https://stackoverflow.com/questions/40848254/opencv-videowriter-size-issue) –

答えて

0

私が気づくの問題がいくつかあります:

  1. あなたがVW1とVW2の両方で同じファイルを開いています。 vw1.release()がファイルを適切に閉じているかどうかわかりません。

  2. ティックカウントを使用して10秒間のビデオ期間を計算するのはちょっと難しいです。代わりにフレームカウンタとフレームレートを使用するのはどうですか?

+0

私は最初の点についてはあまりよく分かりません。私はより良い解決策を求めています。 –

+0

しかし、2番目の問題は重要なポイントではありません。私はGetTickCount()に変更しました。時間は問題ありませんでしたが、問題はまだあります。 –

関連する問題