OpenCV - получение пиксельных данных с камеры устройства

0

Я использую OpenCV 2.4.6. Я нашел в Интернете пример получения кадра с камеры. Он работает хорошо (он отображает мое уродливое лицо на экране). Тем не менее, я абсолютно не могу получить пиксельные данные из фреймов. Я нашел здесь несколько тем: http://answers.opencv.org/question/1934/reading-pixel-values-from-a-frame-of-a-video/, но это не работает для меня.

Вот код - в комментариях я указал, что не так.

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;

int main() {
    int c;
    IplImage* img;
    CvCapture* capture = cvCaptureFromCAM(1);
    cvNamedWindow("mainWin", CV_WINDOW_AUTOSIZE);
    while(1) {
        img = cvQueryFrame(capture);

        uchar* data = (uchar*)img->imageData; // access violation

        // this does not work either
        //Mat m(img);
        //uchar a = m.data[0]; // access violation

        cvShowImage("mainWin", img);
        c = cvWaitKey(10);
        if(c == 27)
            break;
    }
}

Не могли бы вы дать мне несколько предложений, пожалуйста?

Теги:
opencv

1 ответ

2
Лучший ответ

Я предлагаю использовать новую структуру Mat вместо IplImage так как ваш вопрос помечен тегом C++. Для вашей задачи вы можете использовать элемент data Mat - it указывает на внутреннюю память Mat. Например, Mat img; uchar* data = img.data; Mat img; uchar* data = img.data; , Здесь полный пример

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;

int main() {
    int c;
    Mat img;
    VideoCapture capture(0);
    namedWindow("mainWin", CV_WINDOW_AUTOSIZE);
    bool readOk = true;

    while(capture.isOpened()) {

        readOk = capture.read(img);

        // make sure we grabbed the frame successfully 
        if (!readOk) {
            std::cout << "No frame" << std::endl;
            break;
        }

        uchar* data = img.data; // this should work

        imshow("mainWin", img);
        c = waitKey(10);
        if(c == 27)
            break;
    }
}
  • 0
    Он генерирует (даже если я удаляю uchar * data ... part) исключение Microsoft C ++: cv :: Exception в ячейке памяти 0x002BF794 и открывает файл throw.cpp (указывающий последнюю строку в файле) в Visual Studio 2012. :(
  • 0
    хм .. это нормально работает в моей системе, никаких исключений не выдается. Вы используете cv::Mat вместо IplImage как в примере?
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню