我已经在StackOverflow上查看了不同的问题,但似乎没有任何帮助。
我想要做的很简单:我有一个cv::Point
,我需要在cv::Mat
的那个点获取像素的RGB值,这样我就可以将它与存储的RGB值进行比较。
现在这应该很容易,但我尝试了1001种不同的方式,它对我来说不起作用。
有人请从我的痛苦中帮助我!!
编辑:
以下两个答案都有效!
我是C ++的新手,并不知道输出unsigned char
到cout
给出了问号!
printf
offcourse给出正确的价值!!
答案 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);