我正在使用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;
}
答案 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);
}
如有任何问题或需要进一步帮助,请与我联系。快乐编码:)