OpenCV последовательный захват кадров с веб-камеры - PullRequest
4 голосов
/ 29 апреля 2011

Я занимаюсь разработкой приложения для оптического потока в реальном времени с Opencv (C ++).Я не понимаю, как захватить два последовательных кадра, чтобы применить метод отслеживания Лукаса-Канаде.

Это не работает:

CvCapture* capture = cvCaptureFromCAM(1);
IplImage *imgA=cvQueryFrame( capture );
IplImage *imgB=cvQueryFrame( capture );

Я тоже пробовал, но программа невыйти из цикла:

CvCapture* capture = cvCaptureFromCAM(1);
IplImage *imgA=cvQueryFrame( capture );
IplImage *imgB=cvCreateImage(cvSize(imgA),IPL_DEPTH_32F,3);
while(cvNorm(imgA,imgB)==0)
    imgB=cvQueryFrame( capture );

Есть идеи?Я надеюсь, что это не глупый вопрос, но я подозреваю, что это: / Извините заранее.Спасибо !!

Ответы [ 4 ]

3 голосов
/ 29 апреля 2011
cv::Mat m1, m2;
cv::VideoCapture cap(0);

if(!cap.isOpened())
    ;// ... throw error here

cap >> m1;
cap >> m2;

// m1 and m2 now contain consecutive frames.
1 голос
/ 12 февраля 2013

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

IplImage prev = query(capture)

while(1)
   next = query(capture )

   opticalflow( prev, next )

   prev = cvCopy( next )
1 голос
/ 12 февраля 2013

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

IplImage *imgA=cvQueryFrame( capture );

, вы получаете указатель на его внутренний буфер, где хранится изображение.Теперь при выполнении:

IplImage *imgB=cvQueryFrame( capture );

изображение переписывается и указывается указатель на тот же буфер.IMGA == ImgB.Вы должны сделать копию после запроса первого кадра, затем все работает.

0 голосов
/ 03 августа 2017
Mat* mImg;
IplImage* _image;
IplImage* image;
CvCapture* capture = cvCaptureFromCAM(0);

for (int i = 0; i < 15; i++) {
    _image = cvQueryFrame(capture);
}

*image = *_image;

Я всегда с этим сталкиваюсь с ситуацией 0xC0000005. Интересно, что-то не так в моем коде. Я использую image = _image, потому что я думаю, что _image = cvQueryFrame(capture); - это просто указатель на буфер захвата, поэтому я могу сохранить кадр в другой ситуации с памятью.

...