C++/ポインターのヘルプが必要です。RGB IplImage を作成し、i,j にアクセスしたい場合、http ://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv- から取得した次の C++ クラスを使用します。 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" であることです。