Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Быстрый вывод 2D, быстрый ввод с веб-камеры.


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

В данный момент выводимая картинка - это массив байт 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;
}

Автор: gustavomarginale 24.4.2011, 09:54
Up! (-;

Автор: kefir01 24.4.2011, 16:45
Может это поможет?
http://dranger.com/ffmpeg/tutorial01.html - ffmpeg + sld (но можно любой вывод на твой вкус)
http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=35 - вывод видео в opengl. Примечательна функция переворота байтов

Код

void flipIt(void* buffer)                        // Flips The Red And Blue Bytes (256x256)
{
    void* b = buffer;                        // Pointer To The Buffer
    __asm                                // Assembler Code To Follow
    {
        mov ecx, 256*256                    // Set Up A Counter (Dimensions Of Memory Block)
        mov ebx, b                        // Points ebx To Our Data (b)
        label:                            // Label Used For Looping
            mov al,[ebx+0]                    // Loads Value At ebx Into al
            mov ah,[ebx+2]                    // Loads Value At ebx+2 Into ah
            mov [ebx+2],al                    // Stores Value In al At ebx+2
            mov [ebx+0],ah                    // Stores Value In ah At ebx
            
            add ebx,3                    // Moves Through The Data By 3 Bytes
            dec ecx                        // Decreases Our Loop Counter
            jnz label                    // If Not Zero Jump Back To Label
    }
}


Автор: Void 24.4.2011, 17:05
Цитата(gustavomarginale @  18.4.2011,  02:01 Найти цитируемый пост)
Короче, как бы побыстрее выводить массив байт? Пока интересует только линуксовое решение

XVideo и всё что умеет его использовать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)