openCV2.0中对于Mat中存在负值的时…

来源:互联网 发布:电视网络机顶盒什么牌子的好 编辑:程序博客网 时间:2024/05/16 08:49
今天,偶然遇到了一个问题,有一些Mat经过操作后,会形成负值,我遇到的问题是:怎么修改这些负值,也就是怎么对其进行操作???

如果用以前对像素的操作办法进行操作,是不行的,因为以前一直用的是uchar类型的,这种类型的范围是0--255,不可能对负值形成操作,经过一番尝试,可以用两个函数解决这个问题,分别是assighTo或者convertTo这两个函数都可以解决这个问题。

代码如下:
Mat (Mat_(3,3) << 0, -2, 0, -126, 5, -7, 245, -3, 106); //创建一个含有负值的Mat
Mat dst(3,3,CV_8UC1);//用来接收转换后的数据的Mat,注意第三个参数
//C.convertTo(dst,dst.type());//转换函数
C.assignTo(dst,dst.depth());//同上,转换函数
//cout<<dst<<" ";
for(int y=0; y
 
 uchar *data dst.ptr(y);//办法1
for(int x=0; x
 
//printf("%d ",*(dst.data dst.cols*y x));//办法2
//cout << (int)dst.at(y,x)<< ";//办法3
cout << (int)*(data x)<< ";//办法1

NOTE:  在OpenCV中,cv::Mat类提供了一个名为converTo的方法来进行矩阵类型转换。当然使用时需要注意的是,该函数只能进行矩阵深度类型的转换,而不能进行矩阵通道数的转换。若需要进行矩阵通道数的转换,可能需要采取进行其他的方法来变通实现,
验证代码如下:

  1.    
  2.     cv::Mat matOrigin( 10, 10, CV_32FC3, cv::Scalar(10) );  
  3.   
  4.       
  5.     cv::Mat mat8UC3Converted;  
  6.     matOrigin.convertTo( mat8UC3Converted, CV_8UC3, 1, );  
  7.   
  8.     if CV_8UC3 == mat8UC3Converted.type()  
  9.      
  10.         std::cout << "mat8UC3Converted 转换成功。" << std::endl;  
  11.      
  12.     else  
  13.      
  14.         std::cout << "mat8UC3Converted 转换失败。" << std::endl;  
  15.      
  16.   
  17.       
  18.     cv::Mat mat8UC1Converted;  
  19.     matOrigin.convertTo( mat8UC1Converted, CV_8UC1, 1, );  
  20.   
  21.     if CV_8UC1 == mat8UC1Converted.type()  
  22.      
  23.         std::cout << "mat8UC1Converted 转换成功。" << std::endl;  
  24.      
  25.     else  
  26.      
  27.         std::cout << "mat8UC1Converted 转换失败。" << std::endl;  
  28.      
  29.   
  30.     system( "pause" );  
  31.   
  32.     return 0;  
  33. }  

openCV2.0中对于Mat中存在负值的时候的对于像素的读取和修改openCV2.0中对于Mat中存在负值的时候的对于像素的读取和修改

openCV2.0中对于Mat中存在负值的时候的对于像素的读取和修改

0 0