Значение OpenCV RGB для cv :: Point в cv :: Mat - PullRequest
4 голосов
/ 20 января 2011

Я уже рассматривал различные вопросы здесь, в StackOverflow, но, похоже, ни один из них не помогает.То, что я хочу сделать, довольно просто: у меня есть cv::Point, и мне нужно получить значение RGB для пикселя в этой точке в cv::Mat, чтобы я мог сравнить его с сохраненным значением RGB.

Теперь это должно быть очень просто, но я пробовал 1001 разными способами, и это просто не работает для меня.

Кто-то, пожалуйста, помогите мне избавиться от моих страданий !!

edit: оба ответаниже работы!Я немного новичок в C ++ и не знал, что вывод от unsigned char до cout ставит вопросительный знак!printf offcourse дает правильное значение !!

Ответы [ 2 ]

9 голосов
/ 20 января 2011

Это действительно легко. Однако документация 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 .

0 голосов
/ 20 января 2011

Зависит от типа изображения / Мат.Если изображение является обычным 1 байтом для каждого rgb на пиксель, то это один из способов доступа к нему.Это довольно эффективно, но не самым безопасным способом:

// 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;
}

Если коврик другого типа, то вам просто нужно изменить структуру RGB, чтобы она соответствовала вашим потребностям.Попробуйте изменить тип изображения, которое вы читаете, на обычное изображение RGB с этим кодом:

Mat in, out;
cvtColor(in, out, CV_8UC3);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...