我有下面的代码,它读取大约55帧,然后cap.read()函数返回false值

时间:2014-08-24 12:05:50

标签: opencv image-processing video-processing

我正在使用vs 2010的opencv版本2.4.9。运行程序如下所示,它从视频中读取大约55帧然后通过给出消息突然停止
“无法读取帧”因为cap.read(帧)函数返回零 任何人都知道如何解决它。 该计划是

int main(int, char**)
{
VideoCapture cap("C:\\test.avi"); 
if( ! cap.isOpened () )  // check if we succeeded
    return -1;


 double frnb ( cap.get ( CV_CAP_PROP_FRAME_COUNT ) );
 std::cout << "frame count = " << frnb << endl;

 double frmrate ( cap.get ( CV_CAP_PROP_FPS ) );
 std::cout << "frame rate = " << frmrate << endl;



double fIdx=1;
String str="Frame";
for(;;) {
  Mat frame;
  if ( fIdx < 0 || fIdx >= frnb ) break;
  std::cout <<fIdx<<endl;//"    ";
  cap.set ( CV_CAP_PROP_POS_FRAMES , fIdx );
  fIdx=fIdx+frmrate*3;
  bool success = cap.read(frame); 
  if ( ! success ) {
  cout << "Cannot read  frame " << endl;
  break;
  }


}
return 0;
}

1 个答案:

答案 0 :(得分:0)

请用以下内容替换您的for循环。我简化了它。 请注意

1)除非你需要读取随机帧,否则不要使用计算idx等,设置和读取。对于线性帧读取,运算符>>足够好。

2)不要依赖get来自CV_CAP_PROP_FRAME_COUNT的帧数,如果视频或其索引存在问题,则可能会导致问题。最好每次检查帧是否为空。

cv::Mat frame;  
for (;;)
{
    video >> frame;

    if (frame.empty())
    {
        break;
    }

    //do whatever with frame OR uncomment following line to display frame as video
    //cv::imshow("Win_Name", frame); cv::waitKey(25);
}

如有任何问题或需要进一步帮助,请与我联系。快乐编码:)