OpenCV读取.avi文件的VideoCapture得到空帧

时间:2016-11-29 22:01:53

标签: c++ macos opencv opencv3.0

我是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系统有什么关系吗?提前谢谢!

1 个答案:

答案 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
    }
}