关于OpenCV中利用函数cvConvert实现图像数据类型转换(8U->16S)

来源:互联网 发布:redis存储json数据 编辑:程序博客网 时间:2024/06/05 00:44
  最近在做毕设,关于矩形NAM表示方法的。刚刚接触opencv,一些函数用得比较生疏。
  解决灰度图像RNAM算法时要标记已编码的矩形范围,我的方法是将其标记为-1,即处理完一个矩形,即用cvSubS(v+1) “v表示原像素值”将矩形框中的像素减到-1。但由于直接读入的图像数据均为8位无符号整型,所以需将其转换为16位有符号整型,这样才能表示负数。
  利用以下代码直接用函数cvConvert将原图像格式由8位无符号整型转换为16位有符号整型时,发现转换后的图像矩阵按照原来输出图像矩阵数据的方法输出的数据与源图像不一样。
   
IplImage* img = cvLoadImage(argv[1], 0);IplImage* image = cvCreateImage(cvSize(img->width, img->height), IPL_DEPTH_16S, 1);cvConvertScale(img, image);for (int y = 0; y < image->height; ++y){uchar* ptr = (uchar*)(image->imageData + y*image->widthStep);for (int x =0; x < image->width; ++x){cout << int(ptr[x]) << '\t';// cout << bitset<16>(ptr[x]) << '\t';}cout << endl;}

  后将"uchar* ptr = (uchar*)(image->imageData + y*image->widthStep);"中的uchar(8位)改为short int(16位)后数据正确。与ptr的类型有关。

  以后遇到类似问题要考虑到存储数据的类型所占的位数问题。