Openframeworks,从两个视频采集器创建视频纹理

时间:2015-04-18 03:05:19

标签: c++ video openframeworks unsigned-char

我对C ++和图像处理一般都很陌生。

我想创建一个新的unsigned char*,它表示与ofTexture一起使用的像素数组。我目前有两个类似的数组,都来自ofVideoGrabber对象。

我希望通过逐行处理,第一个VideoGrabber的像素,然后是第二个像素的像素来实现这一点。因此,一个视频将在右侧,另一个在左侧。

最终纹理将是组合的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 个答案:

答案 0 :(得分:1)

您应该直接使用视频采集器的ofTexture并将其绘制到FBO来执行此操作,因为它会更简单,更高效。 例如:

<强> 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(),否则将不会分配FBO,也不会有效。