一个使用模板函数进行遥感图像处理易犯但不易调试的错误

29 篇文章 4 订阅
21 篇文章 1 订阅

最近在写点程序,计算相关系数时,和ENVI差别很大,本来以为ENVI做了特别处理,后来拿我以前写的软件算也是和ENVI一样,这把我搞蒙了。

主要用GDAL读图像,然后用模板的方法写处理函数,T1,T2表示数据的数据类型可为char,unsigned int ,int,float,double等。

template<class T1,class T2>
double cof3(int bandx,int bandy,GDALDataset*pDataSet,void*pData)
{

....

double x2sum=0;

double y2sum=0;

//图像读取

T1 *xBuffer=new T1[nw*READROW];

T2 *yBuffer=new T2[nw*READROW];

pDataSet->GetRasterBand(bandx)->RasterIO(GF_Read,nxOff,nyOff,nw,READROW,(void*)xBuffer,nw,READROW,xDataType,0,0);
  pDataSet->GetRasterBand(bandy)->RasterIO(GF_Read,nxOff,nyOff,nw,READROW,(void*)yBuffer,nw,READROW,yDataType,0,0);

...
x2sum+=xBuffer[i*nw+j]*xBuffer[i*nw+j];

y2sum+=yBuffer[i*nw+j]*yBuffer[i*nw+j];

....

}

到这里如果你能发觉问题,那回一下贴让我知道啊,哈哈,那就说明你C++功底扎实。

 

 

 

 

 

 

 

问题在哪里呢?

假如x波段和y波段的数据类型都是GDT_UInt16的,而且xBuffer[i*nw+j]=65535,yBuffer[i*nw+j]=65535,那么x2sum=y2sum=-131071

为什么?

因为两个unsigned int相乘还是unsigned int,但是65535*65535已经超出unsigned int的表示范围了,所以成了负数。

 

解决方法呢?

写出下面这样就行了

   x2sum+=xBuffer[i*nw+j]*(double)xBuffer[i*nw+j];

   y2sum+=yBuffer[i*nw+j]*(double)yBuffer[i*nw+j];

 

所以写两个整数的乘法时,要特别注意,一不小心就会越界。

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kupeThinkPoem

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值