2013年4月24日 星期三

OpenCV - image->imagdata[j*widthStep+i] v.s. cvSet2D(image, j, i, CvScalar)

用cvGet2D()的方式,CvScalar的值如果超過255,會被歸成255。

但用image->imagedata讀資料的話,超過255的值會被扣掉255,

例: 存300,就會變300-256= 44

另外如果用image->imagedata讀資料,做資料的加減乘除,建議轉成double做,而且要先轉unsigned,

例:

double temp1 = (double)(uchar)image->imagedata[j*widthStep+i+1];
double temp2 = (double)(uchar)image->imagedata[j*widthStep+i+2];
image->imagedata[j*widthStep+i] = (temp1+temp2)/2.0f;

因為image->imagadata為char,

假如image->imagedata[j*widthStep+i]的值為10000000(二進位)

那麼在十進位會看成-128,(double)image->imagedata[j*widthStep+i] = -128.0,

但其實在image裡值是0~255,所以他其實表示的值是+128,因此我們要先取unsigned,再取double。

另外若是兩個值相加完除2.0f不整除,用cvSet2D會四捨五入,直接用imagedata會無條件捨去,

例:

//(255+100)/2 = 177.5
cvSet2D(img, j, i, cvScalarAll((255+100)/2.0f));
// 上面這行的值會丟 178
image->imagedata[j*widthStep+i] = (255+100)/2.0f;
// 上面這行的值會丟 177

沒有留言:

張貼留言