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

Posted

技术标签:

【中文标题】Openframeworks,从两个视频采集器创建视频纹理【英文标题】:Openframeworks, creating a video texture from two video grabbers 【发布时间】:2015-04-18 03:05:18 【问题描述】:

我对 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】:

您可能应该直接使用视频采集器的ofTextures 并将它们绘制到 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 将不会被分配并且它不会工作。

【讨论】:

这很好用,谢谢。但是,我希望稍后能够在程序中访问单个像素并更改它们的值。有没有办法将 ofTexture 转换为 unsigned char 然后再转换回来? 您可以使用readToPixels() 方法直接读取像素。但是,根据您尝试执行的操作,使用片段着色器修改像素可能会更有趣。

以上是关于Openframeworks,从两个视频采集器创建视频纹理的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp openFrameworks - 使用ofFmodSoundPlayer从audioPlayer获取原始音频帧

Openframeworks 颜色跟踪

在光流路径场周围创建一个边界框

ffmpeg 命令用于从两个不同的视频和两个不同的音频创建最终视频

WebRTC中Android Demo中的摄像头从采集到预览流程

将音频和视频文件合并为一个 [C++] [关闭]