最近在把matlab的代码转化到VS2010上。
matlab中采用im2double将读入的图像转换为double型,在OpenCV中就需要对图像进行深度的转换。
读入一幅灰度图像,深度为1(8U),在与其他矩阵M做运算事要保证深度是一致的,所以需要转换,如转换到深度为8(64F),需要用到OpenCV中的函数cvConvert。
代码如下:
IplImage* src = cvLoadImage("./Image/2/多波段.bmp",CV_LOAD_IMAGE_GRAYSCALE); //载入灰度图像,深度为8U
IplImage* dst= cvCreateImage(cvSize(src->width,src->height),IPL_DEPTH_64F, 1);
cvConvert(src, dst); //dst的数据部分在数值上与src的值一致,而其深度转换成了64F。
//其实我是用的这个: cvConvertScale(src, dst, 1.0/255, 0);
cvConvert函数用于图像和矩阵之间的相互转换
为什么要用cvConvert 把IplImage转为矩阵?
因为IplImage里的数据,只能用uchar的形式存放,当需要把这些图像数据看作数据矩阵来运算时,0~255的精度显然满足不了要求;
然而CvMat里却可以存放任意通道数、任意格式的数据,这个机制方便了研究中的这种需求,转化为矩阵就可以进行更自由的计算。
opencv的IplImage结构中有一个成员:depth。
其取值如下:
枚举值
用%d输出 二进制
IPL_DEPTH_8U : 8 : 0x0000 0008
IPL_DEPTH_8S :
-2147483640 : 0xffff fff8
IPL_DEPTH_16U : 16 : 0x0000 0010
IPL_DEPTH_16S : -2147483632 : 0xffff fff0
IPL_DEPTH_32S : -2147483616 : 0xffff ffe0
IPL_DEPTH_32F : 32 : 0x0000 0020
IPL_DEPTH_64F : 64 : 0x0000 0040
从文件或摄像头直接读取的图像一般都是8U的
当有特殊计算需求时可以用cvScale() 或cvCvtScale() 转换。
保存时必须转换回8U!
不同的深度其取值范围不一样:
0.0--1.0之间
IPL_DEPTH_64F
0.0--1.0之间
IPL_DEPTH_32F
0--65535之间
IPL_DEPTH_32S
-32768--32767之间
IPL_DEPTH_16S
0--65535之间
IPL_DEPTH_16U
-128--127之间
IPL_DEPTH_8S
0--255之间
IPL_DEPTH_8U
在用cvCreateMat函数时,参数:
CV_8UC1 for Unsigned 8bits
CV_32FC1 for float(32位)
CV_64FC1 for double(64位)