转换图像从IPL_DEPTH_8U到IPL_DEPTH_32S



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

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

提前致谢

Mat代替IplImagethen: 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 ??
}

相关内容

  • 没有找到相关文章

最新更新