我有一个单通道灰度图像(切片)。
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时,我哪里出错?
答案 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";
}