Comment faire pour convertir un 8-bit OpenCV IplImage* 32 bits IplImage*?
J'ai besoin de convertir un 8-bit IplImage en 32 bits IplImage. À l'aide de la documentation sur le web, j'ai essayé les choses suivantes:
//general code
img2 = cvCreateImage(cvSize(img->width, img->height), 32, 3);
int height = img->height;
int width = img->width;
int channels = img->nChannels;
int step1 = img->widthStep;
int step2 = img2->widthStep;
int depth1 = img->depth;
int depth2 = img2->depth;
uchar *data1 = (uchar *)img->imageData;
uchar *data2 = (uchar *)img2->imageData;
for(h=0;h<height;h++) for(w=0;w<width;w++) for(c=0;c<channels;c++) {
//attempt code...
}
//attempt one
//result: white image, two red spots which appear in the original image too.
//this is the closest result, what's going wrong?!
//see: http://files.dazjorz.com/cache/conversion.png
((float*)data2+h*step2+w*channels+c)[0] = data1[h*step1+w*channels+c];
//attempt two
//when I change float to unsigned long in both previous examples, I get a black screen.
//attempt three
//result: seemingly random data to the top of the screen.
data2[h*step2+w*channels*3+c] = data1[h*step1+w*channels+c];
data2[h*step2+w*channels*3+c+1] = 0x00;
data2[h*step2+w*channels*3+c+2] = 0x00;
//and then some other things. Nothing did what I wanted. I couldn't get an output
//image which looked the same as the input image.
Comme vous le voyez je ne sais pas vraiment ce que je fais. J'aimerais savoir, mais je l'aime plus si je pouvais le faire correctement.
Merci pour toute aide que je reçois!
OriginalL'auteur |
Vous devez vous connecter pour publier un commentaire.
Peut-être ce lien peut vous aider?
Modifier En réponse à la deuxième édition de l'OP et le commentaire
Avez-vous essayé
float value = 0.5
au lieu de
float value = 0x0000001;
J'ai pensé à la plage pour un float valeur de couleur va de 0.0 à 1.0, 1.0 où est blanc.
ouais, ouais, c'est bon, vous avez raison! Alors, que donne l'indice suivant: pour les points rouges, R est de 1,0 et GB sont 0.0, et pour le blanc, tous les trois sont de 1,0. Donc, lors de la conversion, les valeurs RVB doit être converti de 0 à 255 de 0.0 à 1.0. Évolution de la valeur de b / 255 rend l'image noir+rouge.
De se! int b = ((char )(img->données images + himg->widthStep))[wimg->nChannels + 0]; // B ((float *)(img2->données images + himg2->widthStep))[w*img2->nChannels + 0] = ((float)b) / 255.0;
OriginalL'auteur Stefan Schmidt
La fonction que vous cherchez est cvConvertScale(). Il automatiquement n'importe quel type de conversion pour vous. Vous avez juste à vous préciser que vous souhaitez mettre à l'échelle par un facteur de 1/255 (qui correspond à l'intervalle [0...255] [0...1]).
Exemple:
Notez le point dans
1/255.
- pour forcer une double division. Sans elle, vous obtenez une échelle de 0.Il est important que vous passez un double facteur d'échelle (ce qui est pourquoi il est '.' derrière le 255). 1/255 d'évaluer en tant que division d'entier et conduire à un facteur d'échelle est de 0. Quel est exactement votre code ne fonctionne pas avec les cvConvertScale() ?
Je souhaite que je pourrais mettre plus upvotes, je upvoted votre commentaire et de votre réponse. J'ai eu du mal sur ce pendant au moins 8 heures goddammit!
Pour les gars qui utilisent l'API C++: im8.convertTo(im32, CV_32FC1);
Au lieu de
cvSize(im8->width, im8->height)
utilisationcvGetSize(im8)
OriginalL'auteur
Virgule flottante couleurs vont de 0.0 à 1.0, et uchars aller de 0 à 255. Le code suivant corrige:
Merci beaucoup, beaucoup pour Stefan Schmidt pour m'aider à résoudre ce!
OriginalL'auteur sgielen
Si vous ne mettez pas de point (.), certains compilateurs comprendre, c'est comme un int de la division, vous donnant un int result (zéro dans ce cas).
OriginalL'auteur
Vous pouvez créer un IplImage wrapper utilisation de boost::shared_ptr et le modèle-la métaprogrammation. Je l'ai fait, et je reçois automatique de collecte des ordures, en collaboration avec automatique de l'image conversions à partir d'une profondeur à l'autre, ou à un seul canal de canal multi-images.
J'ai appelé l'API blImageAPI et il peut être trouvé ici:
http://www.barbato.us/2010/10/14/image-data-structure-based-shared_ptr-iplimage/
Il est très rapide, et dont le code est très lisible, (bon pour le maintien des algorithmes)
Il est peut également être utilisé à la place de IplImage dans opencv algorithmes sans rien changer.
Bonne chance et amusez-vous de l'écriture d'algorithmes!!!
OriginalL'auteur
IplImage *img8,*img32;
img8 =cvLoadImage("a.jpg",1);
//Confirmation pour Vérifier les valeurs des pixels (entre 0 - 1)
OriginalL'auteur