将Fbo裁剪到Openframeworks中的边界框

时间:2015-12-31 17:23:50

标签: c++ pixels openframeworks fbo

我在fbo内有一个绘图,并试图通过使用边界框裁剪到可见部分来减少fbo大小。这是我想要实现的视觉表现: bounding box example

我找到了解决方案:将fbo数据传递给pixels,然后检测图像左侧,右侧,顶部和底部的第一个彩色像素。

在代码的以下部分中,我尝试检测底部交叉点。但我对像素有一个奇怪的问题。

int w = 4;
int h = 4;

fbo.allocate(w, h, GL_RGBA);
fbo.begin();
ofClear(0, 0);
fbo.end();

fbo.begin();
ofSetColor(255, 0, 0);
ofDrawRectangle(0, 0, 4, 2);
fbo.end();

pixels.allocate(w, h, GL_RGBA);

fbo.readToPixels(pixels);

for(auto line = pixels.getLines().end(); line != pixels.getLines().begin(); --line){
    for(auto pixel: line.getPixels()){
        cout <<  "line: " << line.getLineNum() << " color: " << pixel.getColor() << endl;
    }
}

输出:

line: 4 color: 24, 215, 83, 118
line: 4 color: 255, 127, 0, 0
line: 4 color: 173, 7, 0, 0
line: 4 color: 1, 0, 0, 0
line: 3 color: 0, 0, 0, 0
line: 3 color: 0, 0, 0, 0
line: 3 color: 0, 0, 0, 0
line: 3 color: 0, 0, 0, 0
line: 2 color: 0, 0, 0, 0
line: 2 color: 0, 0, 0, 0
line: 2 color: 0, 0, 0, 0
line: 2 color: 0, 0, 0, 0
line: 1 color: 255, 0, 0, 255
line: 1 color: 255, 0, 0, 255
line: 1 color: 255, 0, 0, 255
line: 1 color: 255, 0, 0, 255

line:1看起来很好但line:4出了什么问题,那里的随机颜色是什么?重建应用程序后,他们可能已经离开,但随机的机会。也许还有另一种方法可以通过图像的可见部分裁剪fbo? 这solution对我不起作用。

1 个答案:

答案 0 :(得分:0)

你的循环是个问题。第4行指向未初始化的存储区,而第0行丢失。您的矩形在第0行和第1行绘制。

来自iterator :: end()文档:

  

将迭代器返回到结尾   返回一个迭代器,引用向量容器中的past-the-end元素。

     

过去结束元素是跟随向量中最后一个元素的理论元素。它没有指向任何元素,因此不应被解除引用。

答案的问题可以帮助您: Iterating C++ vector from the end to the begin