我需要一些关于C++和指针的帮助。当我创建一个RGB IplImage并想要访问i,j时,我使用以下C++类,该类来自:http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html
template<class T> class Image
{
private:
IplImage* imgp;
public:
Image(IplImage* img=0) {imgp=img;}
~Image(){imgp=0;}
void operator=(IplImage* img) {imgp=img;}
inline T* operator[](const int rowIndx) {
return ((T *)(imgp->imageData + rowIndx*imgp->widthStep));}
};
typedef struct{
unsigned char b,g,r;
} RgbPixel;
typedef struct{
float b,g,r;
} RgbPixelFloat;
typedef Image<RgbPixel> RgbImage;
typedef Image<RgbPixelFloat> RgbImageFloat;
typedef Image<unsigned char> BwImage;
typedef Image<float> BwImageFloat;
我一直在使用CUDA,有时必须将所有数据放入一个数组中,我喜欢将每个通道存储在自己的数组中,这样处理数据似乎更容易。所以我通常会做一些像这样的事情:
IplImage *image = cvLoadImage("whatever.tif");
RgbImageFloat img(image);
for(int i = 0; i < exrIn->height; i++)
{
for(int j = 0; j < exrIn->width; j++)
{
hostr[j*data->height+i] = img[i][j].r;
hostg[j*data->height+i] = img[i][j].g;
hostb[j*data->height+i] = img[i][j].b;
}
}
我会把数据复制到设备上,对其进行处理,然后将其传回主机,并循环遍历数组,将数据重新赋值给IplImage并保存结果。看起来我在做太多的循环了,必须有一种更快的方法可以使用指针来完成,但我迷失了,必须有一种更有效的方法来完成它。是否有一种方法可以简单地为每个通道使用指针?我尝试过类似这样的操作,但它没有起作用:
float *hostr = &img[0][0].r
float *hostg = &img[0][0].b
float *hostb = &img[0][0].g
有什么建议吗?谢谢!
编辑: 感谢所有回答。也许我的问题没有表述清楚。我知道如何访问通道及其数据。我感兴趣的是提高从IplImage完全复制数据到标准数组的性能和效率,更接近csl迄今为止所说的内容。我看到的问题是IplImage中数据排列的方式是“rgbrgbrgbrgb”。