Openframeworks,从两个视频采集器创建视频纹理
Openframeworks, creating a video texture from two video grabbers
总的来说,我对 C++ 和图像处理还很陌生。
我想创建一个新的 unsigned char*
,它表示用于 ofTexture 的像素数组。我目前有两个相似的数组,它们都来自 ofVideoGrabber 对象。
我希望通过逐行处理第一个 VideoGrabber 的像素,然后是第二个 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;
}
如果有人可以向我建议更好的方法或指出我的代码中的缺陷,我将很高兴听到,谢谢。
您可能应该直接使用视频采集器的 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 将不会被分配并且无法工作。
总的来说,我对 C++ 和图像处理还很陌生。
我想创建一个新的 unsigned char*
,它表示用于 ofTexture 的像素数组。我目前有两个相似的数组,它们都来自 ofVideoGrabber 对象。
我希望通过逐行处理第一个 VideoGrabber 的像素,然后是第二个 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;
}
如果有人可以向我建议更好的方法或指出我的代码中的缺陷,我将很高兴听到,谢谢。
您可能应该直接使用视频采集器的 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 将不会被分配并且无法工作。