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;)现在我可以得到正确的价值。
但是,我不知道为什么会这样。
答案 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])
没有它,它们被解释为字符