繁体   English   中英

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

[英]OpenCV rgb value for cv::Point in cv::Mat

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

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

有人请帮助我摆脱痛苦!

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

这真的很容易。 然而,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备忘单

这取决于图像/ Mat的类型。 如果图像对于每个像素的每个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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM