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

Posted

技术标签:

【中文标题】cv::Mat 中 cv::Point 的 OpenCV rgb 值【英文标题】:OpenCV rgb value for cv::Point in cv::Mat 【发布时间】:2011-01-20 13:50:48 【问题描述】:

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

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

请有人帮助我摆脱痛苦!

编辑: 下面的两个答案都有效! 我对 C++ 有点陌生,不知道通过cout 输出unsigned char 会打一个问号! printf offcourse 给出了正确的价值!!

【问题讨论】:

【参考方案1】:

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

【讨论】:

感谢回答明天试试,但是 cv::Mat 和 cv::Mat3b 有什么区别? 我有一个名为 oldImage 的 cv::Mat 而不是 cv::Mat3b 所以我首先将它复制到一个 cv::Mat3b: cv::Mat3b image = oldImage;然后我按照你的例子做,但是当我尝试输出它时: std::cout 感谢它的工作,但我仍然想知道 cv::Mat 和 cv::Mat3b 之间有什么区别.. Mat3b 是 Mat_> 的 typedef。基本上它是一个带有模板类型的 Mat。当您在编译时知道类型时,访问元素会更容易/更优雅。 Mat 是所有 Mat_* 类的超类,这就是为什么您也可以在 Mat_ 上使用每个 cv 函数。【参考方案2】:

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

【讨论】:

好吧,OpenCV 和图像对我来说都是新的,所以我真的不知道它是什么样的图像(我知道听起来很愚蠢),但它是在 mac 上制作的 png 屏幕截图.. 那么它可能只是一个 rgb 图像。试试上面的代码,对你有用吗? 我尝试输出结果,但它似乎是空的.. (RGB pix = GetRGB(mat, point); std::cout @user458753 我可以看到您用来加载图像的代码吗?你知道图像是否有 alpha 值吗? 我添加了一行代码来检查大小是否相同,你能看到它给了你什么。如果不想使用断言,只需使用 if 语句和断点即可。

以上是关于cv::Mat 中 cv::Point 的 OpenCV rgb 值的主要内容,如果未能解决你的问题,请参考以下文章

获取 cv::Mat 的黑色像素列表

Mat 的几种初始化和赋值方法

将 vector<Point3d> 转换为大小为 (n x 3) 的 Mat,反之亦然

OpenCV 向量访问错误

OpenCV-图像旋转Rotate

OpenCV-图像旋转Rotate