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 ответ
Вы, вероятно, должны использовать ofTexture
s 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.