2014-04-11 16 views
5

Jestem absolutnie nowy w C++ i bibliotece opencv. Przeglądałem stackoverflow i przeszukiwałem sieć, ale nie mogłem znaleźć odpowiedzi na moje pytanie.opencv: jak zapisać tablicę float jako obraz

Jak zapisać tablicę float na obrazie w języku C++? Obecnie (jako ćwiczenie) po prostu ręcznie konwertuję obraz na skalę szarości (chociaż czytałem, że można to zrobić za pomocą opencv).

Później planuję wykonać niektóre operacje filtrowania i inne operacje na pikselach. Dlatego chcę użyć tablicy typu float (o rozmiarze 512 * 512).

Oto kod. Wiem tylko, że tablica float musi zostać przekonwertowana na int lub char lub uint8 lub cv :: Mat, aby można ją było zapisać jako .png, ale nie wiedziałem, jak to zrobić.

Wszelkie wskazówki i linki są bardzo cenne.

#include <stdio.h> 
#include <opencv2/highgui/highgui.hpp> 

int main(void) 
{ 
    // load in image using opencv and convert to char 
    cv::Mat myImg = cv::imread("~/Lenna.png", CV_LOAD_IMAGE_COLOR); 
    unsigned char *img = (unsigned char*)(myImg.data); //somehow only works for unsigned char and not for float (SegFault) 

    float *r = new float[512*512]; 
    float *g = new float[512*512]; 
    float *b = new float[512*512]; 
    float *gray = new float[512*512]; 


    // 3*iCol, bc every pixel takes 3 bytes (one for R channel/B channel /G channel). 
    // see http://answers.opencv.org/question/2531/image-data-processing-in-cvmat/ 
    // faster to loop through rows first and then through colums (bc MAT stored in row-major order) 
    uint iPix = 0; 
    for(int iRow=0; iRow<512 ;iRow++){ 
    for(int iCol=0; iCol<512 ;iCol++){ 
     b[iPix] = (float) img[myImg.step * iRow + 3*iCol  ]; 
     g[iPix] = (float) img[myImg.step * iRow + 3*iCol + 1 ]; 
     r[iPix] = (float) img[myImg.step * iRow + 3*iCol + 2 ]; 
     gray[iPix] = (float) 0.0722*b[iPix] + 0.2126*r[iPix] + 0.7152*g[iPix]; 
     iPix++; 
    } 
    } 


    //write image to file (NOT WORKING!) 
    cv::imwrite("~/imgOut.png", (cv::Mat) gray); 
} 
+0

imwrite z png może obsługiwać uchar. może być ".exr" (jeśli w tym skompilowano obsługę) – berak

Odpowiedz

6

Można użyć

cv::imwrite("~/imgOut.bmp", cv::Mat(512, 512, CV_32FC1, gray)); 

PS: Uratowałem go do BMP zamiast zrobić to praca, ponieważ dla imwrite(), tylko 8-bit (lub 16-bitowa bez znaku (CV_16U) w przypadku PNG, JPEG 2000 i TIFF) obrazy jednokanałowe lub 3-kanałowe (z kolejnością kanałów "BGR") można zapisać za pomocą tej funkcji.

2

Zapisanie go jako BMP nie pomogło w moim przypadku. Użyłem formatu OpenEXR. Musisz zapisać pliki z rozszerzeniem .exr.

Powiązane problemy