Opencv дает мне нечеткий захват камеры

Я использую Opencv 2.0 в среде IDE netbeans 6.9, а моя ОС - Windows 7 64-битная. Когда я пытаюсь захватить кадр из прямой трансляции, я получаю неясный результат.

Камера моего ноутбука (хрустальный глаз Acer) в остальном работает хорошо. Я попытался использовать USB-камеру (logitech), но дал тот же результат. Ниже приведен простой код, который я использую.

#include <stdio.h>   
#include <stdlib.h>
#include <cv.h>
#include <highgui.h>


int main(int argc, char** argv) {    
    CvCapture *video = cvCaptureFromCAM(0);
    IplImage * img = cvQueryFrame(video);

if(!cvGrabFrame(video)){
    printf("could not grab a frame\n");
    exit(0);
}

cvNamedWindow("original_image",0);

cvShowImage("original_image",img);

cvWaitKey(0);

cvReleaseImage(&img);

cvReleaseCapture(&video);

return (EXIT_SUCCESS);

}

Будет очень полезно, если кто-нибудь поможет мне разобраться с этим, потому что я застрял в проекте без продолжения. заранее спасибо


person sach    schedule 24.03.2014    source источник
comment
пожалуйста, сделайте этот мир лучше, и вместо этого используйте opencv c++ api   -  person berak    schedule 24.03.2014
comment
вы имеете в виду, что проблема в том, что я использую язык C вместо C++   -  person sach    schedule 24.03.2014
comment
нет, здесь проблема не в этом. тем не менее, старый c-api мертв и ушел. не используйте его для новых проектов   -  person berak    schedule 24.03.2014
comment
berak совершенно прав, если только по какой-то причине вам не нужно использовать c api ... В противном случае, если вы начинаете новый проект и не используете c api, используйте c ++. И что вы подразумеваете под «неясным выводом»?   -  person marol    schedule 24.03.2014
comment
Видео вообще не воспроизводится. Вы показываете только первый кадр. При захвате первого кадра камера инициализируется и все видит непонятно. Вы должны воспроизводить видео в цикле, чтобы перейти к следующим кадрам. Проверьте мой ответ здесь.   -  person sgarizvi    schedule 24.03.2014
comment
нечеткий вывод в том смысле, что он дает точное изображение, которое я снимаю, но выделяет только освещенные области. другие области просто темные.   -  person sach    schedule 24.03.2014
comment
Поиграйте с настройками камеры (контрастность, экспозиция, яркость). То, что вы описываете, похоже, не является проблемой openCV.   -  person Nallath    schedule 24.03.2014
comment
Я их поправил, но изменений не было вообще. Даже я попробовал камеру logitech. Это дало тот же результат. Вот почему я подумал, что что-то не так с моим кодом.   -  person sach    schedule 25.03.2014


Ответы (1)


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

int main(int argc, char** argv) 
{
    CvCapture *video = cvCaptureFromCAM(0);

    if(!cvGrabFrame(video)) \\check if the video can be queried for frames
    {
        printf("could not grab a frame\n");
        exit(0);
    }

    cvNamedWindow("original_image",0); \\make your output window

    while(1)
    {
        IplImage * img = cvQueryFrame(video); \\get the next frame from the stream

        cvShowImage("original_image",img); \\show the image in the output window

        if(cvWaitKey(0) == 27) \\if escape key is pressed, exit the loop
        {
            break;
        }
    }

    cvReleaseImage(&img);
    cvReleaseCapture(&video);
    return (EXIT_SUCCESS);
}
person Lt. Pigeon    schedule 24.03.2014
comment
Спасибо, Эрик... Это работает для меня. Я попытался зациклить и другие кадры. Но во всяком случае, это не сработало для меня. Так что большое спасибо за вашу помощь. - person sach; 25.03.2014