将 Fbo 裁剪到 Openframeworks 中的边界框
Crop Fbo to a bounding box in Openframeworks
我在 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 对我不起作用。
你的循环有问题。第 4 行指向未初始化的内存区域,而第 0 行缺失。您的矩形绘制在第 0 行和第 1 行。
来自 iterator::end() 文档:
Return iterator to end
Returns an iterator referring to the past-the-end element in the vector container.
The past-the-end element is the theoretical element that would follow the last element in the vector. It does not point to any element, and thus shall not be dereferenced.
一个问题和答案将帮助你:
Iterating C++ vector from the end to the begin
我在 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 对我不起作用。
你的循环有问题。第 4 行指向未初始化的内存区域,而第 0 行缺失。您的矩形绘制在第 0 行和第 1 行。
来自 iterator::end() 文档:
Return iterator to end Returns an iterator referring to the past-the-end element in the vector container.
The past-the-end element is the theoretical element that would follow the last element in the vector. It does not point to any element, and thus shall not be dereferenced.
一个问题和答案将帮助你: Iterating C++ vector from the end to the begin