我有一个大的std :: vector,其中包含rgb(uint8_t)格式的图像数据。 我想要的是将通道分成新的r,g和b向量。 然后做一些算法并将它们重新组合成rgb向量。
我的问题是rgb向量在虚拟内存中是连续的,因此我可以将数据作为一个整体复制或自己访问每个元素,这很慢。 反之亦然,情况也是如此。
是否有一种有效的方式来访问这些元素?
这是我的问题的简短例子,以及我到目前为止所做的事情:
#include <cstdint>
#include <vector>
int main(int argc, char** argv)
{
std::vector<uint8_t> rgb{1,2,3,4,5,6,7,8,9};
std::vector<uint8_t> r, g, b;
for (auto i=0; i<rgb.size()/3; ++i)
{
r.push_back(rgb.at(i*3));
g.push_back(rgb.at(i*3+1));
b.push_back(rgb.at(i*3+2));
}
std::vector<uint8_t> rgb_reconst;
rgb_reconst.resize(rgb.size());
for (auto i=0; i<rgb.size()/3; ++i)
{
rgb_reconst.at(i*3) = r.at(i);
rgb_reconst.at(i*3+1) = g.at(i);
rgb_reconst.at(i*3+2) = b.at(i);
}
}
我可以访问Qt5和OpenCV来解决这个问题,但是我更喜欢一般的C ++ 11解决方案,因为这对其他问题也很有用。