opencv不同深度CvArr*(CvMat*,IplImage*)类型的显示

来源:互联网 发布:长视频软件 编辑:程序博客网 时间:2024/05/18 02:08

对于不同的图片深度,显示是有范围的


下面转一段别人总结的深度显示范围。
测试double型:0.0--1.0之间 IPL_DEPTH_64F

测试float型:0.0--1.0之间 IPL_DEPTH_32F

测试long型:0--65535之间 IPL_DEPTH_32S

测试short int型:-32768--32767之间 IPL_DEPTH_16S

测试unsigned short int型:0--65535之间 IPL_DEPTH_16U

测试char型:-128--127之间 IPL_DEPTH_8S

测试unsigned char型:0--255之间 IPL_DEPTH_8U

这个时候如果需要保存图像,请记住要先转换到IPL_DEPTH_8U的深度。因为只有8位单通道或者3通道(通道顺序为'BGR')才可以使用cvSaveImage保存。


用cvScale 或cvConvertScale(const CvArr* src, CvArr* dst, double scale=1, double shift=0) 来转换,cvConvertScale会将src转为dst,深度由dst决定,如果 scale=1,shift=0 就不会对src进行比例缩放.

同时图像的分辨率过大,Opencv的highgui套件的窗口显示只会显示溢满显示器的部分图片,剩下的将看不到,所以必须要使用cvResize改变图片大小来缩放显示。

显示不同深度和缩放的显示函数代码如下:

void ShowConvertImage(char name[200],IplImage* Image)
{
cvNamedWindow(name,1);
char savename[350];
sprintf(savename,"%s.jpg",name);

cvSaveImage(savename,Image);
if(Image->width<1280)
{

if(Image->depth!=IPL_DEPTH_8U)
{
IplImage* NormalizeImage=NULL;
NormalizeImage=cvCreateImage(cvGetSize(Image),IPL_DEPTH_8U,1);
cvConvertScale(Image,NormalizeImage,1,0);//将图转为0-256,用于图片显示,
cvShowImage(name,NormalizeImage);
cvReleaseImage(&NormalizeImage);
}
else
{
cvShowImage(name,Image);
}
}
else
{
IplImage* ImageResize=cvCreateImage(cvSize(1280,Image->height/(Image->width/1280)),Image->depth ,Image->nChannels);
cvResize(Image,ImageResize,1);
if(ImageResize->depth!=IPL_DEPTH_8U)
{
IplImage* NormalizeImage=NULL;
NormalizeImage=cvCreateImage(cvGetSize(ImageResize),IPL_DEPTH_8U,1);
cvConvertScale(Image,NormalizeImage,1,0);//将图转为0-256,用于图片显示,
cvShowImage(name,NormalizeImage);
cvReleaseImage(&NormalizeImage);
}
else
{
cvShowImage(name,ImageResize);
}

cvReleaseImage(&ImageResize);
}

}

0 0
原创粉丝点击