J'ai besoin d'aide C++/pointeur. Lorsque je crée un RGB IplImage et je veux accéder à i, j-je utiliser la classe C++ suivante tirée de: http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.htmlConvertir IGBImage RGB en 3 tableaux
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;
Je travaille avec CUDA donc parfois je dois mettre toutes les données dans un tableau , J'aime garder chaque canal dans son propre tableau, semble plus facile à gérer les données de cette façon. Je voudrais donc généralement faire quelque chose comme ceci:
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;
}
}
Je puis copier mes données à l'appareil, faire des choses avec lui, faites-le à l'hôte, puis la boucle, encore une fois, à travers le réseau assignant la retourner à IplImage et sauvegarder mes résultats.
Il me semble que je suis en train de faire une boucle, il doit y avoir un moyen plus rapide de le faire avec des pointeurs, mais je suis perdu, il doit y avoir un moyen plus efficace de le faire. Est-ce que je peux simplement utiliser un pointeur pour chaque canal? J'ai essayé de faire quelque chose comme ceci mais cela n'a pas fonctionné:
float *hostr = &img[0][0].r
float *hostg = &img[0][0].b
float *hostb = &img[0][0].g
Des suggestions? Merci!
EDIT: Merci à tous pour votre réponse. Peut-être que je n'étais pas très clair sur ma question. Je suis familier sur la façon d'accéder aux canaux et à leurs données. Ce qui m'intéresse, c'est d'augmenter les performances et l'efficacité de la copie complète des données de l'IplImage vers un tableau standard, plus dans le sens de ce que csl a dit jusqu'ici. Le problème que je vois est que la façon dont les données d'un IplImage sont organisées est "rgbrgbrgbrgb".
Les tableaux hostr, hostg et hostb des flottants? – csl
oui, toutes les données sont flottantes. Toutes les images sont EXRs (flottants 32 bits, pas de moitié) J'ai juste utilisé le code cvLoadImage() comme un exemple rapide. – rem7