Использование Mat:: at (i,j) в opencv для объекта 2-D Mat

Я использую Ubuntu 12.04 и OpenCV 2

Я написал следующий код :

IplImage* img =0;
img = cvLoadImage("nature.jpg");
if(img != 0)
{
    Mat Img_mat(img);
    std::vector<Mat> RGB;
    split(Img_mat, RGB);

    int data = (RGB[0]).at<int>(i,j)); /*Where i, j are inside the bounds of the matrix size .. i have checked this*/ 
}

проблема в том, что я получаю отрицательные значения и очень большие значения в переменную данные. Кажется, я где-то ошибся. Не могли бы вы указать на это?
Я читал документацию (я не закончил ее полностью.. он довольно большой. ) Но из того, что я прочитал, это должно сработать. Но это не так. Что здесь не так?

3 ответов


Img_mat это 3 направлены изображения. Каждый канал состоит из значений пикселей uchar в поле Тип данных. Так и с split(Img_mat, BGR) на Img_mat разбивается на 3 плоскости синего, зеленого и красного, которые совместно хранятся в векторе BGR. Так что BGR[0] это первый (синий) самолет с uchar тип данных пикселей...следовательно, это будет

int dataB = (int)BGR[0].at<uchar>(i,j);
int dataG = (int)BGR[1].at<uchar>(i,j);

и так далее...

@bsdnoobz Я думаю, вы хотели написать

Vec3b data = Img_mat.at<Vec3b>(i,j);
data[0] = // blue pixel
data[1] = // green pixel

и так далее...


вы должны указать правильный тип для cv::Mat::at(i,j). Вы получаете доступ к пикселю как int, в то время как он должен быть вектором uchar. Ваш код должен выглядеть примерно так:

IplImage* img = 0;
img = cvLoadImage("nature.jpg");
if(img != 0)
{
  Mat Img_mat(img);
  std::vector<Mat> BGR;
  split(Img_mat, BGR);

  Vec3b data = BGR[0].at<Vec3b>(i,j);
  // data[0] -> blue
  // data[1] -> green
  // data[2] -> red
}

Почему вы сначала загружаете IplImage? Вы смешиваете интерфейсы C и c++. Загрузка cv:: Mat с imread напрямую будет более прямой.

таким образом, вы также можете указать тип и использовать соответствующий тип в своем вызове.