最近在做图像的FFT变换时,需要将8位的图像转为64位图像处理,以提高计算精度,查了一下手册,cvConvert可以实现这个功能。按照手册说明“将源图像数据类型转换为目标图像类型”,使用了以下代码进行转换:
IplImage* imbufa= cvLoadImage("1.jpg",CV_LOAD_IMAGE_GRAYSCALE);
...
然后在后面进行数据复制的时候报错,原因是图像depth不符,调试发现imbufa以及imbufb仍然是8位,而没有变为预想的64位。翻了手册没有发现什么错误,又上网查了一下,发现一个哥们的博客上有这个函数的用法,上面还举了一个很详细的例子,跟我的用法相同。但是为什么结果不对呢?~
后来我把ima_r赋0值,然后将变换前后图像显示出来,发现变换前ima_r图像为0值图像,而变换后为黑白图像,即有非零像素值,这就是说变换后ima_r被赋值了,就是说cvConvert(src,dst)不但将src图像数据类型改变,还执行了将src的数据赋值到dst的操作。
为了验证这个想法,我又创建了一个8位的图像指针,然后按照该想法将64位的ima_r转到8位的新图像,然后显示出来,结果和imbufa一样。
结论:cvConvert(src,dst)执行两个操作:将src图像数据类型改变为dst图像数据类型;将src的数据赋值到dst。
PS:起先我以为原图像的数据格式也会被改变,原来不会,只是将源图像src的数据按目标图像dst的数据格式转换并赋给dst,就是这样了
~