为什么在访问矩阵中的像素时使用不同的数据类型时会得到不同的值?

时间:2016-08-22 20:04:19

标签: c++ opencv computer-vision

我有一个单通道灰度图像(切片)。

    cout << "num" << slice.channels() << ends; //outputs 1
    for(int x = 0;x<=slice.cols;x++){
        for(int y = 0;y<=slice.rows;y++){
            Vec3b currentPoint = slice.at<Vec3b>(x,y);
            cout << currentPoint;
        }
    }

然而,当我尝试访问像素并期望currentPoint是单个int时,因为它是单个通道图像。但是,我得到的[32, 36, 255]是奇数,因为它意味着三个通道。我很欣赏我使用的是一种说vec 3 b的类型,但即便如此,它还能从哪里获得其他两个元素?

所以我用uchar替换Vec3b,然后我得到了很多\ 377。这更令人困惑。

即使我有3通道图像,在尝试访问Vec3b的单个元素时我得到奇数输出(我得到更多\ 377)。

这怎么有意义?我必须误解如何使用at()方法。

首先,如何为每个像素(0-255)获得单个输出?

另外,当我看到\ 377时,我哪里出错?

1 个答案:

答案 0 :(得分:4)

很多代码行的东西......

  • 由于您的图片是灰度图片,因此您应该使用at<uchar>
  • 进行访问
  • 注意at<>函数接受(rows, cols),它与(x,y)相反。
  • 逐行扫描速度更快,因为矩阵按行存储在内存中。
  • 要打印出uchar的值,您需要转换为int,否则您将获得ASCII编码字符。
  • 循环不应该是<=,而是<,或者你越界了。

所以:

for(int y = 0; y < slice.rows; y++) {
    for(int x = 0; x < slice.cols; x++) {
        uchar currentPoint = slice.at<uchar>(y,x);
        cout << int(currentPoint) << " ";
    }
    cout << "\n";
}