문제

8 비트 iplimage를 32 비트 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.

보시다시피 나는 내가 무엇을하고 있는지 잘 모르겠습니다. 나는 알고 싶지만, 이것을 올바르게 할 수 있다면 더 좋아합니다. 도움을 주셔서 감사합니다!

도움이 되었습니까?

해결책

아마도 이것 링크 도움이 될 수 있습니까?

편집하다 OP의 두 번째 편집 및 주석에 대한 응답으로

당신은 시도 했습니까?

float value = 0.5

대신에

float value = 0x0000001;

플로트 색상 값의 범위는 0.0에서 1.0으로, 1.0은 흰색이라고 생각했습니다.

다른 팁

당신이 찾고있는 기능은 cvconvertscale ()입니다. 자동으로 모든 유형 변환을 수행합니다. 당신은 단지 1/255의 계수 ([0 ... 255]에서 [0 ... 1]까지 매핑)의 계수로 확장하려는 것을 지정하면됩니다.

예시:

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

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

점을 기록하십시오 1/255. - 이중 부서를 강요합니다. 그것 없이는 0의 스케일을 얻습니다.

플로팅 포인트 색상은 0.0에서 1.0으로, Uchars는 0에서 255로 이동합니다. 다음 코드는 다음과 같습니다.

// 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;

많은 감사합니다 스테판 슈미트 이 문제를 해결하도록 도와주었습니다!

DOT (.)를 넣지 않으면 일부 컴파일러는 INT 부문으로 이해하여 int 결과를 제공합니다 (이 경우 0).

boost :: shared_ptr 및 template-metaprogramming을 사용하여 iplimage 래퍼를 만들 수 있습니다. 나는 그렇게했고, 한 깊이에서 다른 깊이에서 다른 채널에서 멀티 채널 이미지로 자동 이미지 변환과 함께 자동 쓰레기 수집을받습니다.

나는 API Blimageapi에 전화했으며 여기에서 찾을 수 있습니다.http://www.barbato.us/2010/10/14/image-data-structure 기반 shared_ptr-iplimage/

매우 빠르며 코드를 매우 읽기 쉽게 만듭니다 (알고리즘 유지에 좋습니다).

OpenCV 알고리즘의 iPlimage 대신 아무것도 변경하지 않고 사용할 수 있습니다.

행운을 빕니다. 재미있는 글쓰기 알고리즘 !!!

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);

// 확인을 위해 픽셀 값을 확인하십시오 (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");
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top