通过数据OpenCV访问像素的差异

时间:2016-10-16 07:31:14

标签: c++ opencv

今天我观察到一件有趣的事情:如果我使用'at'函数访问图像像素,我会收到不同的结果,如果我使用图像成员'data'访问图像像素。
有谁知道它为什么会发生?

int main()
{
    double sigma = 1.0;
    cv::Mat verticalGaussianKernel = getGaussianKernel(7, sigma);
    printImg(verticalGaussianKernel);
    return 0;
}
void printImg(cv::Mat &img)
{
    cout << "---------//------\n";
    if (img.empty())
    {
        cout << "Empty Image\n";
        return;
    }

    for (int i = 0; i < img.size().height; i++)
    {
        for (int j = 0; j < img.size().width; j++)
        {
            cout << int(img.data[i * img.size().height + j]) << " " << img.at<double>(i, j) << endl;
        }
        cout << endl;
    }
    cout << "---------//------\n";
}

代码给出了结果:

  


数据-------   48 ------ 0.00443305
  63 ------ 0.0540056
  171 ----- 0.242036
  251 ----- 0.39905
  10 ------ 0.242036
  12 ------ 0.0540056
  84 ------ 0.00443305

首先我认为数据中的值正常化为0-255,但最后一个字符串反驳了我的猜测

2 个答案:

答案 0 :(得分:2)

你的演员是错的。 .data成员是一个uchar *,您将其取消引用并将该值(单个uchar)转换为int,这就是为什么您没有获得正确的值。

执行此操作的正确方法是将其转换为double *然后取消引用它。以下代码就是这样做的。

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

void printImg(cv::Mat &img) {
    cout << "---------//------\n";
    if (img.empty()) {
        cout << "Empty Image\n";
        return;
    }

    for (int i = 0; i < img.rows; i++) {
        for (int j = 0; j < img.cols; j++) {
                 cout << reinterpret_cast<double *>(img.data)[i * img.cols + j]
                 << " " << img.at<double>(i, j) << endl;
        }
        cout << endl;
    }
    cout << "---------//------\n";
}

int main() {
    double sigma = 1.0;
    cv::Mat verticalGaussianKernel = getGaussianKernel(7, sigma);
    cout << verticalGaussianKernel << endl;
    printImg(verticalGaussianKernel);
    return 0;
}

输出:

[0.004433048175243745;
 0.05400558262241448;
 0.2420362293761143;
 0.3990502796524549;
 0.2420362293761143;
 0.05400558262241448;
 0.004433048175243745]
---------//------
0.00443305 0.00443305

0.0540056 0.0540056

0.242036 0.242036

0.39905 0.39905

0.242036 0.242036

0.0540056 0.0540056

0.00443305 0.00443305

答案 1 :(得分:0)

您正在以char显示数据。相反,将其读作双重

int main()
{
    double sigma = 1.0;
    cv::Mat verticalGaussianKernel = getGaussianKernel(7, sigma);
    printImg(verticalGaussianKernel);
    return 0;
}
void printImg(cv::Mat &img)
{
    cout << "---------//------\n";
    if (img.empty())
    {
        cout << "Empty Image\n";
        return;
    }

    for (int i = 0; i < img.size().height; i++)
    {
        for (int j = 0; j < img.size().width; j++)
        {
            cout << double(img.data[i * img.size().height*sizeof(double) + j*sizeof(double)]) << " " << img.at<double>(i, j) << endl;
        }
        cout << endl;
    }
    cout << "---------//------\n";
}