【问题标题】:Visualization pixel with Opencv Mat at使用 Opencv Mat 的可视化像素
【发布时间】:2013-11-20 09:33:33
【问题描述】:

我不明白为什么我运行代码时输出是一个奇怪的数字:

int main(int argc, char** argv)
{
    Mat im;
    im = imread("lena.png", CV_LOAD_IMAGE_GRAYSCALE);
    cout << im.at<uchar>(0, 0) << endl;
    waitKey(0);
}

如果我可视化图像,我会看到正确的图像。 我哪里错了?

【问题讨论】:

    标签: c++ c opencv


    【解决方案1】:

    因为它显示了符号,比如cout &lt;&lt; char(123) &lt;&lt; endl;

    你必须使用 int cast:

    cout << (int) im.at<uchar>(0, 0) << endl;
    

    【讨论】:

    • 感谢您的回答。我还没有尝试过,但我看到一个非常大的数字,而不是 0 到 255 之间的数字。我不明白这怎么可能。
    • 对不起,我错了。有了你的建议,我得到了正确的价值。非常感谢。
    • 如果有帮助,请批准答案。
    【解决方案2】:

    正如官方documentation 中所述,您不会直接获得实际强度值,而是一个标量。

    试试这个:

    Scalar intensity = im.at<uchar>(0, 0);
    
    cout << intensity.val[0] << endl;
    

    对于具有多个通道的图像,您可以使用:

    Vec3b intensity = im.at<Vec3b>(0, 0);
    cout << intensity.val[0] << intensity.val[1] << intensity.val[2] << endl;
    

    【讨论】:

    • 只有一个通道是实际强度。
    • 是的,但只有一个通道和灰色/RGB(A) 颜色空间。一般来说,它不是,这是你必须记住的。
    • 实际上,如果强度是 Vec3b,你可以这样做cout &lt;&lt; intensity &lt;&lt; endl 并得到类似[255, 10, 22]的东西
    猜你喜欢
    • 2015-10-30
    • 2011-11-03
    • 1970-01-01
    • 2022-07-10
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多