如何将图像从IPL_DEPTH_8U转换为IPL_DEPTH_32S?
我需要使用分水岭功能,我有一个标记图像 IPL_DEPTH_8U。问题是分水岭功能只接受 标记的IPL_DEPTH_32S。
提前致谢,
答案 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.;