cv ::中的cv :: Point的OpenCV rgb值

时间:2011-01-20 13:50:49

标签: c++ opencv

我已经在StackOverflow上查看了不同的问题,但似乎没有任何帮助。 我想要做的很简单:我有一个cv::Point,我需要在cv::Mat的那个点获取像素的RGB值,这样我就可以将它与存储的RGB值进行比较。

现在这应该很容易,但我尝试了1001种不同的方式,它对我来说不起作用。

有人请从我的痛苦中帮助我!!

编辑: 以下两个答案都有效! 我是C ++的新手,并不知道输出unsigned charcout给出了问号! printf offcourse给出正确的价值!!

2 个答案:

答案 0 :(得分:9)

这真的很容易。然而,OpenCV的文档很好地隐藏了简单的答案。

以下是示例代码:

cv::Mat3b image = imread(filename);
cv::Point point(23, 42);
cv::Vec3b template;
template[0] = 128; template[1] = 12; template[2] = 64;

const cv::Vec3b& bgr = image(point);
if (bgr[0] == template[0] && bgr[1] == template[1] && bgr[2] == template[2])
   std::cout << "Colors match!" << std::endl;

有可能更好的方法来处理cv :: Vec,但我忘记了。 另请参阅OpenCV Cheat Sheet

答案 1 :(得分:0)

这取决于图像/垫的类型。如果图像对于每个像素的每个rgb只是正常的1个字节,则这是访问它的一种方式。它非常有效,但不是最安全的方式:

// The RGB values are stored in reverse order (i don't know why)
struct RGB { unsigned char b, g, r; };

// Assumes 1 byte for r,g,b
RGB& GetRGB(cv::Mat &mat, cv::Point p)
{
  assert((mat.step/mat.cols) == sizeof(RGB));
  RGB *data = (RGB*)mat.data;
  data += p.y * mat.cols + p.x;
  return *data;
}

如果Mat的类型不同,那么您只需要更改RGB的结构以匹配您需要的。

尝试使用以下代码将您读入的图像类型更改为普通RGB图像:

Mat in, out;
cvtColor(in, out, CV_8UC3);