我有一个单通道灰度图像(切片)。
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";
}