将图像从IPL_DEPTH_8U转换为IPL_DEPTH_32S

时间:2013-02-26 11:37:58

标签: opencv depth image-conversion

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

我需要使用分水岭功能,我有一个标记图像 IPL_DEPTH_8U。问题是分水岭功能只接受 标记的IPL_DEPTH_32S。

提前致谢,

3 个答案:

答案 0 :(得分:1)

使用Mat代替IplImage 然后:marker_img.convertTo(marker_img,CV_32S);

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

答案 1 :(得分: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 ??

}

答案 2 :(得分:0)

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

Img32s->imageData[y*((int)Img32s->widthStep)+x*3+C]=(int)((uchar*)Img8u->imageData)[y*((int)Img8u->widthStep)+x*3+C]/255.;