如何将图像从IPL_DEPTH_8U转换为IPL_DEPTH_32S?
我需要使用分水岭函数,我有一个标记图像在IPL_DEPTH_8U。问题是分水岭函数只接受IPL_DEPTH_32S用于标记。
提前致谢
用Mat
代替IplImage
then: marker_img.convertTo(marker_img,CV_32S);
如果你想使用IplImage,你必须先缩放图像然后再转换
使用显式强制转换在每个通道的每个像素手动执行:
Img32s->imageData[y*((int)Img32s->widthStep)+x*3+C]=(int)((uchar*)Img8u->imageData)[y*((int)Img8u->widthStep)+x*3+C]/255.;
如果您不想使用新的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 ??
}