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



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

    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],这是奇怪的,因为它意味着三个通道。我欣赏我使用的类型,说vec3b,但即便如此,它从哪里得到其他两个元素?

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

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

这怎么说得通?我一定是误解了at()方法的用法。

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

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

对于几行代码来说有很多东西…

  • 由于您的图像是灰度图像,您应该使用at<uchar>访问它。
  • 注意at<>函数接受与(x,y)相反的(rows, cols)
  • 逐行扫描更快,因为矩阵是按行存储在内存中。
  • 要打印出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";
}

相关内容

  • 没有找到相关文章

最新更新