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_这取决于图像/垫子的类型。如果图像对于每个像素的每个 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 值的主要内容,如果未能解决你的问题,请参考以下文章