OpenCV C ++ Video Capture не работает - PullRequest
2 голосов
/ 15 октября 2010

Я использую компьютер Mac OS X 10.6.У меня OpenCV 2.1 x64, скомпилированный из исходного кода с использованием Xcode и его компилятора GCC.

У меня возникли проблемы с использованием функций чтения видео на C ++ в OpenCV.Вот простой тестовый код, который я использую (пришел прямо из документации OpenCV):

#include "cv.h"
#include "highgui.h"

using namespace cv;

int main(int, char**)
{
    VideoCapture cap(0); // open the default camera
    if(!cap.isOpened())  // check if we succeeded
        return -1;

    Mat edges;
    namedWindow("edges",1);
    for(;;)
    {
        Mat frame;
        cap >> frame; // get a new frame from camera
        cvtColor(frame, edges, CV_BGR2GRAY);
        GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5);
        Canny(edges, edges, 0, 30, 3);
        imshow("edges", edges);
        if(waitKey(200) >= 0) break;
    }
    // the camera will be deinitialized automatically in VideoCapture destructor
    return 0;
}

Программа компилируется нормально, но когда я пытаюсь ее запустить, я вижу, что на моей веб-камере загорается зеленый светЧерез несколько секунд программа завершает работу с сообщением об ошибке:

OpenCV Error: Bad flag (parameter or structure field) (Unrecognized or unsupported array type) in cvGetMat, file /Users/mark/Downloads/OpenCV-2.1.0/src/cxcore/cxarray.cpp, line 2476
terminate called after throwing an instance of 'cv::Exception'
  what():  /Users/mark/Downloads/OpenCV-2.1.0/src/cxcore/cxarray.cpp:2476: error: (-206) Unrecognized or unsupported array type in function cvGetMat

В режиме отладки матрица все еще кажется пустой после строки cap >> frame.

Я получаю похожее поведение, когда пытаюсь сделать захват из видеофайла или изображения, поэтому это не камера.Что не так, как вы думаете?Что я могу сделать, чтобы сделать эту работу?

РЕДАКТИРОВАТЬ: Я хотел бы добавить, что если я использую функции C, все работает нормально.Но я бы хотел придерживаться C ++, если смогу.

Спасибо

Ответы [ 5 ]

3 голосов
/ 15 февраля 2012

Я видел ту же проблему. Когда я использую функции C, иногда возникает аналогичный вопрос. Из сообщения об ошибке кода C, я думаю, это произошло, потому что камера получила нулевой кадр. Поэтому я думаю, что это можно решить следующим образом:

do
{
    capture>>frame;
}while(frame.empty());

Таким образом, он работает на моей машине.

2 голосов
/ 18 августа 2013

Я столкнулся с той же проблемой, кажется, что первые две попытки получить видео не будут возвращать никакого сигнала, поэтому, если вы попытаетесь использовать его, вы получите ошибку, вот как я обошел это, просто добавив счетчик и проверка размера видео.

int cameraNumber = 0;
if ( argc > 1 )
    cameraNumber = atoi(argv[1]);

cv::VideoCapture camera;
camera.open(cameraNumber);
if ( !camera.isOpened() ) {
    cerr << "ERROR: Could not access the camera or video!" << endl;
    exit(1);
}

//give the camera 40 frames attempt to get the camera object, 
//if it fails after X (40) attemts the app will terminatet, 
//till then it will display 'Accessing camera' note;

int CAMERA_CHECK_ITERATIONS = 40;
while (true) {

    Mat cameraFrame;
    camera >> cameraFrame;
    if ( cameraFrame.total() > 0 ) {
        Mat displayFrame( cameraFrame.size(), CV_8UC3 );
        doSomething( cameraFrame, displayFrame );
        imshow("Image", displayFrame );
    } else {
        cout << "::: Accessing camera :::" << endl;
        if ( CAMERA_CHECK_ITERATIONS > 0 ) CAMERA_CHECK_ITERATIONS--;
        if ( CAMERA_CHECK_ITERATIONS < 0 ) break;
    }


    int key = waitKey(200);
    if (key == 27) break;

}
1 голос
/ 16 декабря 2012

Привет, у меня есть решение для вас:)

VideoCapture san_cap(0);
if (san_cap.isOpened()) {
    while (1) {



        san_cap.read(san);

        imshow("Video", san);

        Mat frame;
        san_cap.read(frame);      // get a new frame from camera
        cvtColor(frame, edges, CV_BGR2GRAY);

        imshow("Video2", edges);



        int key = cv::waitKey(waitKeyValue);

        if (key == 27 ) {
            break;
        }
    }
} 
1 голос
/ 28 июня 2011

Перейти к project->project properties->configuration properties->linker->input

В дополнительных зависимостях вставить cv210.lib cvaux210.lib cxcore210.lib highgui210.lib

1 голос
/ 15 октября 2010

Попробуйте упростить программу, чтобы вы могли определить точное местоположение проблемы, например, измените ваш цикл так, чтобы он выглядел так:

for(;;)
{
    Mat frame;
    cap >> frame; // get a new frame from camera
//  cvtColor(frame, edges, CV_BGR2GRAY);
//  GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5);
//  Canny(edges, edges, 0, 30, 3);
//  imshow("edges", edges);
    imshow("edges", frame);
    if(waitKey(200) >= 0) break;
}

Если это работает нормально, попробуйте добавить вызовы обработки, по одному, например,

for(;;)
{
    Mat frame;
    cap >> frame; // get a new frame from camera
    cvtColor(frame, edges, CV_BGR2GRAY);
//  GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5);
//  Canny(edges, edges, 0, 30, 3);
    imshow("edges", edges);
    if(waitKey(200) >= 0) break;
}

и так далее ...

Как только вы определили проблемную линию, вы можете сосредоточиться на этом и продолжить расследование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...