LINUX.ORG.RU

Как быстро выводить картинку с веб-камеры?


0

1

Приведённый код берёт картинку с веб-камеры и выводит её в 3 окна. Это очень сильно жрёт проц как на получении картинки с веб-камеры так и на её вывод в окна. В то же время программа guvcview показывает картинку с этой веб-камеры в разрешении 864x480/29fps без какого-либо заметного поедания проца. Короче, как бы побыстрее выводить массив байт? Пока интересует только линуксовое решение, хотя весь код пишется кросс-платформенно, даже под CMake.

В данный момент выводимая картинка - массив байт RGBRGBRGBRGBRGB... Его будет требоваться модифицировать и выводить. Сейчас к нему есть доступ через (char*)(frame->imageData). В каком формате должны будут быть данные, выводимые на экран предложенным вами быстрым способом - не суть, это всегда можно обеспечить.

Спасибо.

#include <iostream>
#include <opencv/cv.h>
#include <opencv/highgui.h>

int main ( void )
{
    CvCapture *camera = cvCreateCameraCapture(0);
    IplImage  *frame = 0;

    /* create a window for the video */
    cvNamedWindow( "w1", CV_WINDOW_AUTOSIZE );
    cvNamedWindow( "w2", CV_WINDOW_AUTOSIZE );
    cvNamedWindow( "w3", CV_WINDOW_AUTOSIZE );

    while ( 1 )
    {
        frame = cvQueryFrame(camera);
        if ( !frame )
            break;

        cvShowImage("w1", frame);
        cvShowImage("w2", frame);
        cvShowImage("w3", frame);
        cvWaitKey(33);
    }
    return 0;
}

> Короче, как бы побыстрее выводить массив байт?

Через 2D-текстуры OpenGL?

pacify ★★★★★
()
Ответ на: комментарий от kiverattes

может выразился неправильно, и неофиты напряглись :)

вобщем 95% времени процесс носится вхолостую по вот этим вот строчкам

    while ( 1 )
    {
        frame = cvQueryFrame(camera);
        if ( !frame )
            break;

и соответсвенно жрёт ресурс CPU

MKuznetsov ★★★★★
()

А зачем вы openCV используете?

А для того, чтобы не плодить полученные с камеры кадры, я использовал mmap-буфер в разделяемой памяти (точнее, четыре буфера). Основная программа «дергала» ioctl'ами v4l2, а номер текущего буфера помещала в разделяемую память. Другие программки брали этот номер и считывали кадр. Таким образом основная программа без помех работала, а посмотреть, что там получается, можно было хоть из десятка вспомогательных...

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от MKuznetsov

По этим строчкам он носиться не может - если !frame, - выход из цикла, иначе продолжаем выполнять дальнейшие команды.

kiverattes ★☆
() автор топика
Ответ на: комментарий от Eddy_Em

Затем, что это просто. Не нужно писать ничего с ioctl и т.п. Но, оказалось, тормозно.

kiverattes ★☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.