Openframeworks, создание видео текстуры из двух видео захватов

Я очень новичок в C++ и обработки изображений в целом.

Я хочу создать новый unsigned char*который представляет массив пикселей для использования с ofTexture. В настоящее время у меня есть два аналогичных массива, которые оба из объектов ofVideoGrabber.

Я надеялся добиться этого, обрабатывая строку за строкой, пиксели первого VideoGrabber, а затем пиксели второго. Так что одно видео будет справа, а другое слева.

Окончательной текстурой будет ширина объединенных массивов videoGrabber. где в качестве высоты будет так же, как в одном видеограббере.

Насколько я могу судить, моя логика верна, но мой код дает странные результаты.

unsigned char* videoSample::createSample(unsigned char* left, unsigned char* right)
{
texture = new unsigned char[((vidWidth*2)*vidHeight)*3];
int totalSize = ((vidWidth*2)*vidHeight)*3;
bool drawLeft=true;                             //flag for indicating which video grabber to draw from
int l=0;                                        //for counting the pixels of the left video
int r=0;                                        //for counting the pixels of the right video
for(int i = 0; i < totalSize; i++)
{

    if(i%vidWidth==0)
    {
        drawLeft=!drawLeft;
    }
    if(drawLeft)
    {
        l++;
    }
    else
    {
        r++;
    }
    if(drawLeft)
    {
        texture[i] = left[l];
    }
    else
    {
        texture[i] = right[r];
    }
}
return texture;
}

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

1 ответ

Решение

Вы, вероятно, должны использовать ofTextures of the video grabbers directly and draw them to an FBO to do this as it will be simpler and more efficient. Например:

videoSample.h:

#pragma once
#include "ofMain.h"

class videoSample {

    ofFbo fbo;
    /* ... */

    public:
        void setup();
        ofTexture& createSample(ofVideoGrabber& v1, ofVideoGrabber& v2);
};

videoSample.cpp:

#include "videoSample.h"

void videoSample::setup(){
    // Allocate the FBO
    fbo.allocate(vidWidth * 2, vidHeight, GL_RGBA);
    // Clear its content
    fbo.begin();
        ofClear(0, 0, 0, 0);
    fbo.end();
}


ofTexture& videoSample::createSample(ofVideoGrabber& v1, ofVideoGrabber& v2){
    fbo.begin();
        // Draw the texture of the first video grabber at x = 0 and y = 0
        v1.getTextureReference().draw(0, 0);
        // Draw the texture of the second video grabber at x = vidWidth and y = 0
        v2.getTextureReference().draw(vidWidth, 0);
    fbo.end();  
    // Finally return the reference to the fbo's texture 
    return fbo.getTextureReference();
}

Не забудьте позвонить setup()например в вашем ofApp::setup() otherwise the FBO won't be allocated and it won't work.

Другие вопросы по тегам