0

如何将图像从 IPL_DEPTH_8U 转换为 IPL_DEPTH_32S?

我需要使用分水岭函数,并且在 IPL_DEPTH_8U 中有一个标记图像。问题是分水岭函数只接受 IPL_DEPTH_32S 作为标记。

提前致谢,

4

3 回答 3

1

使用Mat而不是IplImagemarker_img.convertTo(marker_img,CV_32S);

如果要使用IplImage,则必须先对图像进行缩放,然后再进行转换

于 2013-02-26T13:54:46.733 回答
0

使用显式转换为每个通道的每个像素手动执行:

Img32s->imageData[y*((int)Img32s->widthStep)+x*3+C]=(int)((uchar*)Img8u->imageData)[y*((int)Img8u->widthStep)+x*3+C]/255.;
于 2013-02-26T15:40:01.613 回答
0

如果您不想使用新的 cv::Mat 版本,可以尝试以下操作:

 IplImage* converted = cvCreateImage(cvSize(img->width,img->heigth),IPL_DEPTH_32S);

 for (int i = 0;i<img->heigth;i++)
     for(int j = 0;j<img-width;j++)
         ((signed long*)(converted->imageData+i*converted->widthStep))[j] = ((unsigned char*)(img->imageData+i*img->widthStep))[j]

如果您有 3 通道图像 !!!!!!!!! 您必须使用以下内容:

 IplImage* converted = cvCreateImage(cvSize(img->width,img->heigth),IPL_DEPTH_32S,3);

 for (int i = 0;i<img->heigth;i++)
     for(int j = 0;j<3*(img-width);j++)//since you have 3 channels
         ((signed long*)(converted->imageData+i*converted->widthStep))[j] = ((unsigned char*)(img->imageData+i*img->widthStep))[j]

以及编写代码的更好的教学方法:

     for (int i = 0;i<img->heigth;i++)
         for(int j = 0;j<(img-width);j++)
{
             ((signed long*)(converted->imageData+i*converted->widthStep))[j*3] = ((unsigned char*)(img->imageData+i*img->widthStep))[j*3]//R or B ??
             ((signed long*)(converted->imageData+i*converted->widthStep))[j*3+1] = ((unsigned char*)(img->imageData+i*img->widthStep))[j*3+1]//G
             ((signed long*)(converted->imageData+i*converted->widthStep))[j*3+2] = ((unsigned char*)(img->imageData+i*img->widthStep))[j*3+2]//R or B ??

}
于 2013-02-26T15:08:00.277 回答