Ich muss ein 8-Bit IplImage in ein 32-Bit IplImage konvertieren. Mit der Dokumentation aus dem ganzen Web ich folgende Dinge ausprobiert habe:Wie konvertiert man ein 8-Bit OpenCV IplImage * in ein 32-Bit IplImage *?
// 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.
Wie Sie sehen, ich weiß wirklich nicht, was ich tue. Ich würde es gerne herausfinden, aber ich würde es mehr lieben, wenn ich das richtig machen könnte. Danke für jede Hilfe, die ich bekomme!
Dort auf dieser Seite, Teile des Codes einige interessante Informationen ist, die erklären, was ich habe bereits versucht, aber die Ergebnisse sind die gleichen. Bitte beachten Sie den folgenden Link für ein Beispiel für das, was schief geht: http://files.dazjorz.com/cache/conversion.png – sgielen
whoa, ja, das ist ein Nun, das ist der richtige Hinweis: Für die roten Punkte ist R 1.0 und GB 0.0, und für das Weiß sind alle drei 1.0, also beim Konvertieren die RGB-Werte d wird von 0 bis 255 auf 0,0 bis 1,0 umgerechnet. Wenn Sie den Wert auf b/255 ändern, wird das Bild schwarz + rot. – sgielen
Verstanden! int b = ((uchar *) (img-> imageData + h * img-> widthStep)) [w * img-> nKanäle + 0]; // B ((float *) (img2-> imageData + h * img2-> breiteStep)) [w * img2-> nKanäle + 0] = ((float) b)/255.0; – sgielen