【发布时间】:2010-12-06 19:18:51
【问题描述】:
我需要一些 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”。
【问题讨论】:
-
hostr、hostg 和 hostb 是浮点数组吗?
-
是的,所有数据都是浮点数。所有图像都是 EXR(32 位浮点数,而不是半数)我只是使用 cvLoadImage() 代码作为一个快速示例。
标签: c++ performance arrays opencv iplimage