доступ к многоканальному элементу opencv

Я пытаюсь узнать, как использовать новый c ++-интерфейс openCV.

Как получить доступ к элементам многоканальной матрицы. например:

Mat myMat(size(3, 3), CV_32FC2); for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { //myMat_at_(i,j) = (i,j); } } 

Каков самый простой способ сделать это? Что-то вроде cvSet2D старого интерфейса
Каков наиболее эффективный способ? Аналогично использованию прямых указателей в старом интерфейсе.

спасибо

 typedef struct elem_ { float f1; float f2; } elem; elem data[9] = { 0.0f }; CvMat mat = cvMat(3, 3, CV_32FC2, data ); float f1 = CV_MAT_ELEM(mat, elem, row, col).f1; float f2 = CV_MAT_ELEM(mat, elem, row, col).f2; CV_MAT_ELEM(mat, elem, row, col).f1 = 1212.0f; CV_MAT_ELEM(mat, elem, row, col).f2 = 326.0f; 

Обновление: для OpenCV2.0

1. выберите один тип для представления элемента

Mat (или CvMat) имеет 3 измерения: row, col, channel.
Мы можем получить доступ к одному элементу (или пикселю) в матрице, указав строку и col.

CV_32FC2 означает, что элемент имеет 32-битное значение с плавающей запятой и 2 канала.
Таким образом, элемент в вышеприведенном коде является допустимым представлением CV_32FC2 .

Вы можете использовать другие представления, которые вам нравятся. Например :

 typedef struct elem_ { float val[2]; } elem; typedef struct elem_ { float x;float y; } elem; 

OpenCV2.0 добавляет некоторые новые типы для представления элемента в матрице, например:

 template class CV_EXPORTS Vec // cxcore.hpp (208) 

Поэтому мы можем использовать Vec для представления CV_32FC2 или использовать:

 typedef Vec Vec2f; // cxcore.hpp (254) 

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

2. доступ к элементу

Самый простой и эффективный способ доступа к элементу в classе Mat – Mat :: at.
Он имеет 4 перегрузки:

 template _Tp& at(int y, int x); // cxcore.hpp (868) template const _Tp& at(int y, int x) const; // cxcore.hpp (870) template _Tp& at(Point pt); // cxcore.hpp (869) template const _Tp& at(Point pt) const; // cxcore.hpp (871) // defineded in cxmat.hpp (454-468) // we can access the element like this : Mat m( Size(3,3) , CV_32FC2 ); Vec2f& elem = m.at( row , col ); // or m.at( Point(col,row) ); elem[0] = 1212.0f; elem[1] = 326.0f; float c1 = m.at( row , col )[0]; // or m.at( Point(col,row) ); float c2 = m.at( row , col )[1]; m.at( row, col )[0] = 1986.0f; m.at( row, col )[1] = 326.0f; 

3. взаимодействовать со старым интерфейсом

Mat предоставляет 2 функции преобразования:

 // converts header to CvMat; no data is copied // cxcore.hpp (829) operator CvMat() const; // defined in cxmat.hpp // converts header to IplImage; no data is copied operator IplImage() const; // we can interact a Mat object with old interface : Mat new_matrix( ... ); CvMat old_matrix = new_matrix; // be careful about its lifetime CV_MAT_ELEM(old_mat, elem, row, col).f1 = 1212.0f; 

Vic вы должны использовать Vec3b вместо Vec3i:

 for (int i=0; i(i,j)[0] = 0; image.at(i,j)[1] = 0; image.at(i,j)[2] = 0; } } } 

Вы можете напрямую обращаться к базовому массиву данных:

 Mat myMat(size(3, 3), CV_32FC2); myMat.ptr(y)[2*x]; // first channel myMat.ptr(y)[2*x+1]; // second channel 

это зависит от типа данных Mat, который вы используете, если это числовое значение, например CV_32FC1, вы можете использовать:

 myMat.at(i, j) 

если это тип uchar, то вы можете получить доступ к элементу, используя

 (symb.at(i, j)).val[k] 

где k – канал, то есть 0 для изображений в оттенках серого и 3 для цветных

Лучший способ получить доступ к многоканальному массиву с помощью c ++ api – это создать указатель на определенную строку, используя метод ptr.

Например;

type elem = matrix.ptr(i)[N~c~*j+c]

где

  • type : тип данных (float, int, char ect ..)
  • i : строка, в которой вы заинтересованы
  • Nc : количество каналов
  • j : колонку, в которой вы заинтересованы
  • c : интересующая вас колонка (0-3)

Для получения информации о другом преобразовании c-> c ++ ознакомьтесь с этой ссылкой: Источник

  • opencv рисует 2d гистограмму
  • Есть ли замена для blockproc в Matlab?
  • Ошибка OpenCV imread (filename) в режиме отладки при использовании библиотек выпуска
  • Где я могу начать изучать обработку изображений и распознавание объектов?
  • пропорции перспективно-деформированного прямоугольника
  • OpenCV C ++ / Obj-C: расширенное определение квадратов
  • Как уменьшить количество цветов в изображении с помощью OpenCV?
  • Простое обнаружение объектов с использованием OpenCV и машинного обучения
  • MATLAB vs C ++ vs OpenCV - imresize
  • Простой и быстрый метод сравнения изображений для сходства
  • Обработка изображений: улучшение алгоритма для распознавания «Coca-Cola Can»
  • Давайте будем гением компьютера.