2011-12-23 68 views
0

我正在使用OpenCV计算灰度图像的渐变,某些像素的结果值为负值(但我无法在屏幕上将它们打印出来)。print Mat float

我的代码:

Mat gradX, kernelX, gray; 
//i load an rgb image and convert it to grayscale here 
gray.create(rows,cols,CV_32FC1); 
kernelX = (Mat_<float>(1,3) << -1, 0, 1); 
gradX.create(rows,cols,CV_32FC1); 
filter2D(gray,gradX,-1, kernelX,cvPoint(-1, -1),0); 

我已经试过这2种方法来打印5x5的顶部的左gradX

的角落

方法的值1(它打印非常小的所有值(例如1.23E-40等)):

for (int j=0; j<5;j++) 
{ 
    for (int i=0; i<5;i++) 
    { 
     cout<< (float)gradX.at<float>(j, i) << " "; 
    } 
    cout<< endl; 
} 

方法2(它打印正值罚款,但所有负值均显示为 “0”):

for (int j=0; j<5;j++) 
{ 
    uchar* data=gradX.ptr<uchar>(j); 
    for (int i=0; i<5;i++) 
    { 
     cout<< (float)data[i] << " "; 
    } 
    cout<< endl; 
} 
+0

您是否尝试创建具有已知值的垫子并跳过计算。这允许你检查你的打印代码或filter2d代码是否是错误的 – 2011-12-23 16:16:26

+0

谢谢,我用已知的值测试它,它似乎工作,我会研究filter2d(它的OpenCV的函数),并检查它为什么返回如此之低的值 – Saad 2011-12-23 16:37:36

回答

1

你为什么不

cout << gradX << endl; 

+0

我得到此错误“在'std :: cout << gradX'”中不匹配'operator <<' – Saad 2011-12-23 18:57:08

1

关于方法2,东西看起来怪我在那边, 将其更改为:

for (int j=0; j<5;j++) 
{ 
    float* data=gradX.ptr<float>(j); 
    for (int i=0; i<5;i++) 
    { 
     cout<< data[i] << " "; 
    } 
    cout<< endl; 
} 

你在彩车(4字节数组访问第i个字符(字节) )而不是访问第i个浮点(你正在做的(开始+我*字节),你需要(开始+我* 4 *字节))