今天,偶然遇到了一个问题,有一些Mat经过操作后,会形成负值,我遇到的问题是:怎么修改这些负值,也就是怎么对其进行操作???
如果用以前对像素的操作办法进行操作,是不行的,因为以前一直用的是uchar类型的,这种类型的范围是0--255,不可能对负值形成操作,经过一番尝试,可以用两个函数解决这个问题,分别是assighTo或者convertTo这两个函数都可以解决这个问题。
代码如下:
代码如下:
Mat
C
=
(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
Mat
//C.convertTo(dst,dst.type());//转换函数
C.assignTo(dst,dst.depth());//同上,转换函数
//cout<<dst<<"
for(int
{
for(int
{
//printf("%d
//cout
cout
NOTE: 在OpenCV中,cv::Mat类提供了一个名为converTo的方法来进行矩阵类型转换。当然使用时需要注意的是,该函数只能进行矩阵深度类型的转换,而不能进行矩阵通道数的转换。若需要进行矩阵通道数的转换,可能需要采取进行其他的方法来变通实现,
验证代码如下:
-
-
cv::Mat matOrigin( 10, 10, CV_32FC3, cv::Scalar(10) ); -
-
-
cv::Mat mat8UC3Converted; -
matOrigin.convertTo( mat8UC3Converted, CV_8UC3, 1, 0 ); -
-
if ( CV_8UC3 == mat8UC3Converted.type() ) -
{ -
std::cout << "mat8UC3Converted 转换成功。" << std::endl; -
} -
else -
{ -
std::cout << "mat8UC3Converted 转换失败。" << std::endl; -
} -
-
-
cv::Mat mat8UC1Converted; -
matOrigin.convertTo( mat8UC1Converted, CV_8UC1, 1, 0 ); -
-
if ( CV_8UC1 == mat8UC1Converted.type() ) -
{ -
std::cout << "mat8UC1Converted 转换成功。" << std::endl; -
} -
else -
{ -
std::cout << "mat8UC1Converted 转换失败。" << std::endl; -
} -
-
system( "pause" ); -
-
return 0; - }