質問

I変換する必要がある8ビットIplImageを32ビットIplImage.用ドキュメンテーションのwebたって以下のこと:

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

Iは、フロートの色の値の範囲は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;

多くの、多くん シュテファン-シュミット のため助かってい修正。

あなたは、ドット(。)を入れていない場合は、

、理解するいくつかのコンパイラはあなたにint型の結果(この場合はゼロ)を与える、int型部門としてある。

あなたはブースト:: shared_ptrのテンプレート・メタプログラミングを使用してIplImageへのラッパーを作成することができます。私はそれを行っている、私は別の深さから自動画像変換と共に、自動ガベージコレクションを取得し、またはマルチチャンネル画像に1チャンネルから

私は、API blImageAPIと呼ばれてきた、それはここで見つけることができます: http://www.barbato.us/ 10分の2010/14 /画像データ構造ベース-の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