Wie konvertiert einen 8-bit-OpenCV IplImage* auf einer 32-bit-IplImage*?
Brauche ich zum konvertieren eines 8-bit-IplImage zu einem 32-bit IplImage. Mit Dokumentation, die von allen über die Website, die ich habe versucht, die folgenden Dinge:
//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.
Als Sie sehen, dass ich nicht wirklich weiß, was ich Tue. Ich würde gerne herausfinden, aber ich würde es lieben, mehr könnte ich dies richtig gemacht.
Vielen Dank für jede Hilfe, die ich bekomme!!!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vielleicht link kann man helfen?
Bearbeiten In Reaktion auf die zweiten edit des OP und der Kommentar
Haben Sie versucht,
float value = 0.5
statt
float value = 0x0000001;
Ich dachte, die reichen für einen float-Wert Farbe geht von 0.0 bis 1.0, wobei 1.0 ist weiß.
Die Funktion, die Sie suchen, ist cvConvertScale(). Es automagisch kennt einer Art Konvertierung für Sie. Sie müssen nur angeben, dass Sie möchten, um die Skala um einen Faktor von 1/255 (das ordnet den Bereich [0...255] [0...1]).
Beispiel:
Beachten Sie den Punkt in
1/255.
- zu zwingen, eine doppelte Teilung. Ohne Sie erhalten Sie eine Skala von 0.cvSize(im8->width, im8->height)
verwendencvGetSize(im8)
cvConvertScale(im8, im32, 1.0, 0.0);
Floating-point-Farben gehen von 0.0 bis 1.0 und uchars gehen von 0 bis 255. Der folgende code behebt es:
Vielen, vielen Dank an Stefan Schmidt dass Sie mir helfen, dieses Problem beheben!
Wenn Sie nicht setzen den Punkt (.), manche Compiler verstehen ist als eine int-division, so dass Sie ein int-Resultat (null ist in diesem Fall).
Können Sie eine IplImage-wrapper mithilfe von boost::shared_ptr und template-metaprogramming. Ich habe das getan, und ich bekomme eine automatische garbage collection, zusammen mit der automatischen Bild-Konvertierungen von einer Tiefe zur anderen oder von einem Kanal zu multi-channel-Bilder.
Habe ich aufgerufen, die API blImageAPI und es kann hier gefunden werden:
http://www.barbato.us/2010/10/14/image-data-structure-based-shared_ptr-iplimage/
Es ist sehr schnell, und der code sehr gut lesbar (gut für die Aufrechterhaltung algorithmen)
Es kann auch verwendet werden, anstelle von IplImage in opencv-algorithmen, ohne etwas zu ändern.
Viel Glück und Spaß beim schreiben der algorithmen!!!
IplImage *img8,*img32;
img8 =cvLoadImage("a.jpg",1);
//Für die Bestätigung, Überprüfen Sie die pixel-Werte (zwischen 0 - 1)