OpenCv中改变图像尺寸

原文地址:http://blog.sina.com.cn/s/blog_7155fb1a01012b5p.html


首先初始目标图像尺寸:

方法一:IplImage*  dst= cvCreateImage( cvSize((size.width & -2)/2, (size.height & -2)/2), 8, 1 );

分析:size.width & -2----size.width和-2做‘与’运算

从补码算起,我们知道计算机内存里面负数是以补码形式存储并参与运算的,那-2的补码是多少呢?在vc环境下,注意到cvsize结构体内成员变量是int型的,而vc里面int型是占4个字节的所以-2的补码是:

11111111 11111111 11111111 11111110

那么size.width & -2就是把最后一位width的最后一位置0,

下面分析为什么要把最后一位置为0

  1. 如果源图像的width为奇数,则通过和-2相与,最后一位设为0,相当于图像width减小了1,然后再除以2,刚好为源图像分配了一半的width
  2. 如果源图像的width为偶数,则通过和-2相与,该数值不变,然后除以2,也为源图像分配一半的width。

方法二:按比例缩放float scale = 0.723; //缩放倍数为0.723倍则定义:

CvSize dst_size;

dst_size.height = (int)(pSrc->height*scale);
dst_size.width = (int)(pSrc->width*scale);

IplImage* dst= cvCreateImage( dst_size,8, 1 );

方法三:按具体高宽 

CvSize dst_size;

dst_size.height = 120;
dst_size.width = 60;

IplImage* dst= cvCreateImage( dst_size,8, 1 );

 

然后具体实施缩放

cvResiz(src,dst,CV_INTER_LINEAR );

插值方法:
CV_INTER_NN - 最近邻插值,
CV_INTER_LINEAR - 双线性插值 (缺省使用)
CV_INTER_AREA - 使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现。当图像放大时,类似于 CV_INTER_NN 方法..
CV_INTER_CUBIC - 立方插值.

注:

cvResize(src,dst)
必须先分配好空间,注意数据类型一致性,多数错误都是因为数据类型问题。
cvConvertScale(src,dst,scale,shift)
先分配好空间,注意数据类型,同为单通道,或多通道。
可以实现不同深度之间的转换,scale和shift要注意。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值