Использование 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 напрямую будет более прямой.
таким образом, вы также можете указать тип и использовать соответствующий тип в своем вызове.