OpenCV читает VideoCapture файла .avi и получает пустой кадр

Я новичок в 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;
}

Однако программа всегда возвращает мне пустые кадры. Он может печатать «Загружен», но после этого продолжает печатать «ПУСТО». Я пробовал эту программу на встроенной камере, например, VideoCapture cap (0);, а также для чтения других файлов .avi, и она отлично работает в обоих случаях. Я также попытался запустить отладчик, и оказалось, что после строки «cap >> frame» фрейм действительно пуст.

Кто-нибудь может мне помочь? Связана ли эта проблема с системой Mac? Заранее спасибо!


person moderato    schedule 29.11.2016    source источник


Ответы (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
    }
}
person Jake OPJ    schedule 30.11.2016
comment
В чем конкретно заключается проблема OP и как ваш код должен ее решить? - person Dan Mašek; 30.11.2016
comment
Строка 2 - почему указатель? Строка 3 - указатель разыменования без проверки, в данном случае унифицированный указатель. Строка 4 - неявное преобразование из double в int, вызовет предупреждение. Строка 5 - счетчик не определен. Строки 5 + 6 - почему не просто цикл for? Строка 8 - frameIsCorrect больше никогда не использовалась. Строка 9 - imshow не полностью определено, отсутствуют закрывающие скобки вокруг строкового литерала и newImg используется без проверки. Строка 10 - waitKey не соответствует требованиям. - person Dan Mašek; 30.11.2016
comment
Спасибо Дэн Масек. Это было задумано как ориентир, у меня это сработало очень давно. - person Jake OPJ; 30.11.2016