Доступ к элементам и подматрицам
Материал из CompVision
Содержание |
GetSubRect
Возвращает заголовок матрицы являющейся прямоугольной подматрицей входной матрицы
arr - входная матрица.
submat - сюда будет возвращен результат
rect - координаты "прямоугольника интереса".
Функция возвращает указатель на заголовок определенной параметром rect прямоугольной матрицы. Другими словами, она позволяет пользователю обращаться с прямоугольными фрагментами матрицы как с отдельными матрицами. ROI принимается функцией во внимание, следовательно возвращается фрагмент матрицы с учетом ROI.
GetRow, GetRows
Возвращают заголовок, относящийся к заданной строке/интервалу строк исходного массива
arr - исходная матрица
CvMat* cvGetRow( const CvArr* arr, CvMat* submat, int row ); CvMat* cvGetRows( const CvArr* arr, CvMat* submat, int start_row, int end_row, int delta_row=1 );
arr - исходная матрица
submat - сюда будет возвращен результат
row - индекс выделяемой строки
start_row - индекс начала группы выделяемых строк (включительно)
end_row - индекс конца группы выделяемых строк.(не включительно)
delta_row - шаг индекса в выделенном промежутке. Так что функция извлекает каждую delta_row - тую строку из промежутка от start_row до end_row.
Функции GetRow, GetRows возвращают заголовок, относящийся к заданной строке/интервалу строк исходного массива.
GetRow - это сокращенный вариант функции GetRows:
cvGetRow( arr, submat, row ) ~ cvGetRows( arr, submat, row, row + 1, 1 );
GetCol, GetCols
Возвращает подматрицу из одного или интервала из нескольких столбцов исходной матрицы
CvMat* cvGetCol( const CvArr* arr, CvMat* submat, int col ); CvMat* cvGetCols( const CvArr* arr, CvMat* submat, int start_col, int end_col );
arr - исходная матрица
submat - сюда будет возвращен результат
col - индекс выделяемого столбца
start_col - индекс начала группы выделяемых столбцов (включительно)
end_col - индекс конца группы выделяемых столбцов.(не включительно)
delta_col - шаг индекса в выделенном промежутке. Так что функция извлекает каждый delta_col - тый столбец из промежутка от start_col до end_col. Функции GetCol, GetCol возвращают заголовок, относящийся к заданному столбцу/интервалу столбцов исходного массива.
GetCol - это сокращенный вариант функции GetCols:
cvGetCol( arr, submat, col ) ~ cvGetCols( arr, submat, col, col + 1 );
GetDiag
Возвращает одну из диагоналей матрицы
CvMat* cvGetDiag( const CvArr* arr, CvMat* submat, int diag=0 );
arr - исходная матрица
submat - сюда помещают результат
diag - диагональ матрицы 0 - относится к главной диагонали, -1 - к диагонали на 1 выше главной, 1 - на 1 ниже главной и так далее. Функция возвращает заголовок матрицы, содержащей элементы диагонали исходной матрицы.
InitSparseMatIterator
Инициализирует итератор по элементам разреженной матрицы
CvSparseNode* cvInitSparseMatIterator( const CvSparseMat* mat, CvSparseMatIterator* mat_iterator );
mat - входная матрица
mat_iterator - (выход) инициализированный итератор.
GetNextSparseNode
Перемещает итератор на следующий элемент разреженной матрицы и возвращает на него указатель.
CvSparseNode* cvGetNextSparseNode( CvSparseMatIterator* mat_iterator );
В текущей версии нет особенного порядка следования элементов, потому что они хранятся в хэш-таблице. Пример, приведенный ниже, демонстрирует как итерировать по разреженной матрице:
Использование cvInitSparseMatIterator и cvGetNextSparseNode для вычисления суммы элементов разреженной матрицы.
//-------------------------------------------------------------------------------------- double sum; int i, dims = cvGetDims( array ); CvSparseMatIterator mat_iterator; CvSparseNode* node = cvInitSparseMatIterator( array, &mat_iterator ); for( ; node != 0; node = cvGetNextSparseNode( &mat_iterator )) { int* idx = CV_NODE_IDX( array, node ); /* получаем указатель на индексы элементов */ float val = *(float*)CV_NODE_VAL( array, node ); /* получаем значения элементов (предполагаем что тип элементов массива CV_32FC1) */ printf( "(" ); for( i = 0; i < dims; i++ ) printf( "%4d%s", idx[i], i < dims - 1 "," : "): " ); printf( "%g\n", val ); sum += val; } printf( "\nTotal sum = %g\n", sum ); //--------------------------------------------------------------------------------------
GetElemType
Возвращает тип элементов матрицы
int cvGetElemType( const CvArr* arr );
arr - входной массив
Функция cvGetElemType возвращает тип элементов массива см. cvCreateMat.
(CV_8UC1 ... CV_64FC4)
GetDims, GetDimSize
Возвращает количество измерений матрицы и размеры этих измерений или размер конкретного измерения
int cvGetDims( const CvArr* arr, int* sizes=NULL ); int cvGetDimSize( const CvArr* arr, int index );
arr - входная матрица
sizes - необязательный выходной параметр - вектор размеров измерений матрицы. Для 2D матрицы количество строк (высота) идет первой, количество столбцов вторым.
index - индекс измерения начинается с 0. (для матриц 0 - означает кол-во строк, 1- кол-во столбцов, для изображений 0 - высота в пикселях, 1- ширина в пикселях)
Функция cvGetDims - возвращает возвращает количество измерений матрицы и размеры этих измерений. В случае IplImage или CvMat она всегда возвращает 2, независимо от количества строк матрицы/изображения.
Функция cvGetDimSize - возвращает размер заданного отдельного измерения (количество элементов вдоль этого измерения). Например, приведенный ниже код вычисляет общее количество элементов массива двумя способами:
// через cvGetDims() int sizes[CV_MAX_DIM]; int i, total = 1; int dims = cvGetDims( arr, size ); for( i = 0; i < dims; i++ ) total *= sizes[i]; // через cvGetDims() и cvGetDimSize() int i, total = 1; int dims = cvGetDims( arr ); for( i = 0; i < dims; i++ ) total *= cvGetDimsSize( arr, i );
Ptr*D
Возвращает указатель на заданный элемент матрицы
uchar* cvPtr1D( const CvArr* arr, int idx0, int* type=NULL ); uchar* cvPtr2D( const CvArr* arr, int idx0, int idx1, int* type=NULL ); uchar* cvPtr3D( const CvArr* arr, int idx0, int idx1, int idx2, int* type=NULL ); uchar* cvPtrND( const CvArr* arr, int* idx, int* type=NULL, int create_node=1, unsigned* precalc_hashval=NULL );
arr - входная матрица
idx0, idx1, idx2 - индексы элемента
idx - указатель на массив индексов (для многомерного плотного массива)
type - (необязательный выходной параметр) тип элемента массива
create_node - (необязательный входной параметр) для разреженных матриц. Значение не равное нулю, говорит о том, что если запрашиваемый элемент не существует то он будет создан.
precalc_hashval - (необязательный входной параметр) для разреженных матриц.Значение не равное NULL , говорит о том, что функция не будет пересчитывать значение хеша элемента, а возьмет его из определенного места. (Полезно для попарных (pair-wise) операций).
Функция Ptr*D - возвращает указатель на заданный элемент массива. Количество измерений входной матрицы должно совпадать с количеством индексов передаваемых функции, за исключением функции Ptr1D - которая обеспечивает последовательный доступ к элементам матриц любых размерностей (1D, 2D, плотных многомерных матриц). Доступ к элементам разреженных многомерных матриц может быть осуществлен также. При этом если запрашиваемый элемент не существует, он будет создан и значение его будет установлено в нуль.
Get*D
Возвращает заданный элемент матрицы
CvScalar cvGet1D( const CvArr* arr, int idx0 ); CvScalar cvGet2D( const CvArr* arr, int idx0, int idx1 ); CvScalar cvGet3D( const CvArr* arr, int idx0, int idx1, int idx2 ); CvScalar cvGetND( const CvArr* arr, int* idx );
arr - входная матрица
idx0, idx1, idx2 - индексы элемента
idx - указатель на массив индексов (для многомерного плотного массива)
Доступ к элементам разреженных многомерных матриц может быть осуществлен также. При этом если запрашиваемый элемент не существует будет возвращен нуль. Новый элемент при этом не создается.
GetReal*D
Возвращает заданный элемент одноканальной матрицы
double cvGetReal1D( const CvArr* arr, int idx0 ); double cvGetReal2D( const CvArr* arr, int idx0, int idx1 ); double cvGetReal3D( const CvArr* arr, int idx0, int idx1, int idx2 ); double cvGetRealND( const CvArr* arr, int* idx );
arr - входная матрица
idx0, idx1, idx2 - индексы элемента
idx - указатель на массив индексов (для многомерного плотного массива)
Если функции передать много канальную матрицу, то это вызывает Runtime Error.
Доступ к элементам разреженных многомерных матриц может быть осуществлен также. При этом если запрашиваемый элемент не существует будет возвращен нуль. Новый элемент при этом не создается.
mGet
Возвращает заданный элемент одноканальной 2D матрицы (более быстрый чем cvGetReal2D)
double cvmGet( const CvMat* mat, int row, int col );
arr - входная матрица
row - строка
col - столбец
Это inline замена для cvGetReal2D - осуществляет меньше проверок, проверяет границы параметров row col только в режиме отладки.
Set*D
Изменяет заданный элемент матрицы
void cvSet1D( CvArr* arr, int idx0, CvScalar value ); void cvSet2D( CvArr* arr, int idx0, int idx1, CvScalar value ); void cvSet3D( CvArr* arr, int idx0, int idx1, int idx2, CvScalar value ); void cvSetND( CvArr* arr, int* idx, CvScalar value );
arr - входная матрица
idx0, idx1, idx2 - индексы элемента
idx - указатель на массив индексов (для многомерного плотного массива)
value - значение, присваиваемое элементу.
Изменение элементов разреженных многомерных матриц может быть осуществлено также. При этом если запрашиваемый элемент не существует, он будет создан и значение его будет установлено равным value.
SetReal*D
Изменяет заданный элемент одноканальной матрицы
void cvSetReal1D( CvArr* arr, int idx0, double value ); void cvSetReal2D( CvArr* arr, int idx0, int idx1, double value ); void cvSetReal3D( CvArr* arr, int idx0, int idx1, int idx2, double value ); void cvSetRealND( CvArr* arr, int* idx, double value );
arr - входная матрица
idx0, idx1, idx2 - индексы элемента
idx - указатель на массив индексов (для многомерного плотного массива) value - значение, присваиваемое элементу.
Доступ к элементам разреженных многомерных матриц может быть осуществлен также. При этом если запрашиваемый элемент не существует он будет создан и ему будет присвоно значение value.
mSet
Изменяет заданный элемент одноканальной 2D матрицы
arr - входная матрица
row - строка
col - столбец
Это inline замена для cvSetReal2D - осуществляет меньше проверок, проверяет границы параметров row col только в режиме отладки.
ClearND
Обнуление(кроме разреженной)/удаление(в разреженной) элемента матрицы
void cvClearND( CvArr* arr, int* idx );
arr - входная матрица
idx - указатель на массив индексов (для многомерного плотного массива)
Функция обнуляет заданный элемент плотной матрицы, и удаляет элемент разреженной матрицы. Если элемент не сущемтвует, функция ничего не делает.