我是OpenCV的新手,并尝试运行一个简单的程序,该程序读取.avi文件并在窗口中逐帧显示。我的系统是OSX El Capitan。这是我的代码:
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/core/core.hpp"
#include <iostream>
#include <stdio.h>
using namespace std;
using namespace cv;
int main( int argc, const char** argv )
{
Mat frame;
VideoCapture cap("crs01.avi");
if(!cap.isOpened()){ // check if we succeeded
cout << "Video not loaded!!" << endl;
return -1;
} else {
cout << "Loaded!!" << endl;
}
int count = cap.get(CV_CAP_PROP_FRAME_COUNT);
for(int i = 0; i < count; i++){
// while(true) {
cap >> frame;
if(!frame.empty()){
imshow("edges", frame);
} else {
cout << "EMPTY" << endl;
}
if(waitKey(30) >= 0)
break;
}
cap.release();
return 0;
}
但是,程序总是返回空帧。它可以打印“已加载”,但之后它会继续打印“EMPTY”。我已经在内置摄像头上尝试了这个程序,即VideoCapture cap(0);以及读取其他.avi文件,它在两种情况下都能正常工作。我还试图运行一个调试器,事实证明在“cap&gt;&gt; frame”行之后帧确实是空的。
任何人都可以帮助我吗?这个问题与Mac系统有什么关系吗?提前谢谢!
答案 0 :(得分:-1)
这是另一种方法。
cv::VideoCapture mycap;
std::string fileName="PATH_TO_FILE//FILENAME";
mycap.open(fileName);
int totalFrameNumber = (int)mycap.get(CV_CAP_PROP_FRAME_COUNT);
cv::Mat newImg;
for (int counter = 0; counter<totalFrameNumber; counter++){
bool frameIsCorrect = mycap.read(newImg);
if (new_Img.cols>0)
{
cv::imshow("frame", newImg);
cv::waitKey(1); //or waitKey(0) to pause on every new frame for a key press
}
}