为什么RGB组件打印为符号,直到我添加+' 0' - ' 0'给他们?

时间:2017-10-26 13:41:32

标签: c++ opencv

void onMouse(int event, int x, int y, int flags, void* param)
{
//  Mat *pMat = (Mat*)param;
//  Mat image = Mat(*pMat);
    Mat image(512, 512, CV_8UC3, Scalar(255, 255, 255));
    Vec3b planes = image.at<Vec3b>(y, x);

    switch (event)
    {
    case EVENT_LBUTTONDOWN:
        cout << "(" << y << "," << x << ") = (" << planes.val[0] + '0'<< ", " << planes.val[1] + '0' << ", " << planes.val[2] + '0' << ")" << endl;
    }
}

我尝试获取RGB颜色的每个值,但没有显示适当的值。 相反,它出现像一些字符,如&#39;↓&#39; &#39;┐&#39;这些东西。 因此,我只需添加&#39; 0&#39; 0到变量 planes.val [0] 的末尾,结果编号出来了,但问题是数字上升到303(而不是255)。

通过应用一些意想不到的步骤,我终于得到了正确的价值。

我添加了 - &#39; 0&#39;到最后, (所以它是=&gt; planes.val [0] +&#39; 0&#39; - &#39; 0&#39; )(而不是planes.val [0]或者是plane .val [0] +&#39; 0&#39;)现在我可以得到正确的价值。

但是,我不知道为什么会这样。

2 个答案:

答案 0 :(得分:4)

Vec3b基本上是一个3 uchar(unsigned char)的数组。它将它显示为一个奇怪的字符,因为uchar的数字是一个字符(查看ascii表)。角色&#39; 0&#39;是数字48(48 + 255 = 303)所以303来自那里。最后你减去了那个数字,然后你回到了255 ......要把它作为一个数字显示在cout中,正确的是将它转换为int。

代码如下:

cout << "(" << y << "," << x << ") = (" << static_cast<int>(planes.val[0]) << ", " << static_cast<int>(planes.val[1]) << ", " << static_cast<int>(planes.val[2])<< ")" << endl;

只是添加一点点。正如milleniunbug所说,它背后发生的是调用整数提升,这就是为什么你得到可显示的数字......但是如果在其他情况下使用它不会打印,这可能会产生不良行为。

答案 1 :(得分:3)

只需使用以下方法打印值:

static_cast<unsigned>(planes.val[0])

没有它,它们被解释为字符