Frage

Ich brauche eine 8-Bit-IplImage auf einen 32-Bit IplImage zu konvertieren. Mit der Dokumentation aus dem ganzen Web Ich habe folgende Dinge ausprobiert:

// 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 gerne herausfinden, aber ich würde es lieben, wenn ich könnte dies richtig getan. Vielen Dank für jede ich Hilfe bekommen!

War es hilfreich?

Lösung

Vielleicht ist diese Link können Ihnen helfen?

Bearbeiten Als Antwort auf die zweite Bearbeitung der OP und den Kommentar

Haben Sie versucht,

float value = 0.5

statt

float value = 0x0000001;

dachte ich, der Bereich für einen Schwimmer Farbwert von 0,0 bis 1,0 geht, wobei 1,0 ist weiß.

Andere Tipps

Die Funktion, die Sie suchen ist cvConvertScale (). Es tut automatisch jede Art Konvertierung für Sie. Sie müssen nur angeben, dass Sie mit einem Faktor von 1/255 skalieren möchten (die den Bereich abbildet [0 ... 255] bis [0 ... 1]).

Beispiel:

IplImage *im8 = cvLoadImage(argv[1]);
IplImage *im32 = cvCreateImage(cvSize(im8->width, im8->height), 32, 3);

cvConvertScale(im8, im32, 1/255.);

Beachten Sie den Punkt in 1/255. - eine doppelte Teilung zu erzwingen. Ohne sie Sie eine Skala von 0 erhalten.

Gleitpunkt Farben gehen von 0,0 bis 1,0, und uchars geht von 0 bis 255. Der folgende Code behebt es:

// h is height, w is width, c is current channel (0 to 2)
int b = ((uchar *)(img->imageData + h*img->widthStep))[w*img->nChannels + c];
((float *)(img2->imageData + h*img2->widthStep))[w*img2->nChannels + c] = ((float)b) / 255.0;

Vielen, vielen Dank an Stefan Schmidt für die Hilfe dieses Problem beheben!

Wenn Sie den Punkt nicht platziere (.), Werden einige Compiler ist als int Division verstehen Sie eine int Ergebnis (in diesem Fall Null) zu geben.

Sie können einen IplImage Wrapper mit boost :: shared_ptr und Template-Metaprogrammierung erstellen. Ich habe getan, und ich automatische Garbage Collection, zusammen mit automatischer Bild Konvertierungen von einer Tiefe zu einem anderen oder von einem Kanal zu Mehrkanal-Bildern.

Ich habe die API blImageAPI genannt, und es ist hier zu finden: http://www.barbato.us/ 2010/10 / 14 / Bild-Daten-Struktur-basierte-shared_ptr-IplImage /

Es ist sehr schnell, und macht Code sehr gut lesbar, (gut für die Aufrechterhaltung der Algorithmen)

Es ist auch ohne etwas zu verändern, anstatt IplImage in opencv Algorithmen verwendet werden.

Viel Glück und viel Spaß beim Schreiben Algorithmen !!!

IplImage * img8, * img32;
img8 = cvLoadImage ( "a.jpg", 1);

    cvNamedWindow("Convert",1);
    img32 = cvCreateImage(cvGetSize(img8),IPL_DEPTH_32F,3);
    cvConvertScale(img8,img32,1.0/255.0,0.0);

// Für Bestätigung Überprüfen Sie die Pixelwerte (von 0 - 1)

    for(int row = 0; row < img32->height; row++ ){
                float* pt = (float*) (img32->imageData + row * img32->widthStep);
                for ( int col = 0; col < width; col++ )
                            printf("\n %3.3f , %3.3f , %3.3f ",pt[3*col],pt[3*col+1],pt[3*col+2]);                  
            }

    cvShowImage("Convert",img32);
    cvWaitKey(0);
    cvReleaseImage(&img8);
    cvReleaseImage(&img32);
    cvDestroyWindow("Convert");
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top