cvConvert用法

本文深入探讨了OpenCV中cvConvert函数的功能,解释了其如何将图像数据类型转换,并意外地执行数据赋值操作。通过实例演示了函数的实际应用和潜在陷阱,强调了图像数据类型转换的重要性及其对后续图像处理步骤的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在做图像的FFT变换时,需要将8位的图像转为64位图像处理,以提高计算精度,查了一下手册,cvConvert可以实现这个功能。按照手册说明“将源图像数据类型转换为目标图像类型”,使用了以下代码进行转换:

IplImage* imbufa= cvLoadImage("1.jpg",CV_LOAD_IMAGE_GRAYSCALE);
       IplImage* imbufb= cvLoadImage("2.jpg",CV_LOAD_IMAGE_GRAYSCALE);
       IplImage* ima_r=cvCreateImage(cvGetSize(imbufa),IPL_DEPTH_64F,1);
       cvConvert(imbufa,ima_r);
       cvConvert(imbufb,ima_r);

...

然后在后面进行数据复制的时候报错,原因是图像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,就是这样了

因为IplImage里的数据,你只能用uchar的形式存放,当你需要这些图像数据看作数据矩阵来运算时,0~255的精度显然满足不了要求;然而CvMat里却可以存放任意通道数、任意格式的数据,这个机制方便了研究中的这种需求,转化为矩阵就可以进行更自由的计算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值