Карта посещений

Счетчики

Реклама Google

 

Инициализация

Материал из CompVision

Перейти к: навигация, поиск

Содержание

CreateImage

Создает заголовок и выделяет память под данные изображения.

IplImage* cvCreateImage( CvSize size, int depth, int channels );

size - задает ширину и высоту изображения.

depth - задает битовую глубину элементов изображения. Может принимать значения:

   * IPL_DEPTH_8U - беззнаковые 8-битные целые (байт)
   * IPL_DEPTH_8S - 8 битные целые со знаком
   * IPL_DEPTH_16U - беззнаковые 16 - битные целые
   * IPL_DEPTH_16S - 16- битные целые со знаком
   * IPL_DEPTH_32S - 32 - битные целые со знаком
   * IPL_DEPTH_32F - плавающая точка одинарной точности
   * IPL_DEPTH_64F - плавающая точка двойной точности

channels - количество каналов на элемент (пиксел). Может быть 1,2,3 или 4. Каналы чередуются, например, обычное расположение цветовых данных в изображении такое - b0 g0 r0 b1 g1 r1 ... , где b0, g0, r0 - значение для компоненты цвета нулевого пикселя, b1, g1, r1 - значение для компоненты цвета первого пикселя.

Формат изображения IPL может хранить и нечередующиеся цветовые данные, сначала все синие, потом красные, потом зеленые компоненты. И некоторые функции OpenCV могут с ними работать. Однако Createimage создает только изображения с чередующимися цветовыми данными. Функция вызывает:

функцию создания заголовка

header = cvCreateImageHeader(size,depth,channels);

и функцию выделения памяти для данных изображения.

cvCreateData(header);

CreateImageHeader - Выделяет память, инициализирует структуру IplImage (память под данные изображения не выделяются)

IplImage* cvCreateImageHeader( CvSize size, int depth, int channels );

size - задает ширину и высоту изображения.

depth - задает битовую глубину элементов изображения. Может принимать значения:

   * IPL_DEPTH_8U - беззнаковые 8-битные целые (байт)
   * IPL_DEPTH_8S - 8 битные целые со знаком
   * IPL_DEPTH_16U - беззнаковые 16 - битные целые
   * IPL_DEPTH_16S - 16- битные целые со знаком
   * IPL_DEPTH_32S - 32 - битные целые со знаком
   * IPL_DEPTH_32F - плавающая точка одинарной точности
   * IPL_DEPTH_64F - плавающая точка двойной точности

channels - количество каналов на элемент (пиксел). Может быть 1,2,3 или 4. Каналы чередуются, например, обычное расположение цветовых данных в изображении такое - b0 g0 r0 b1 g1 r1 ... , где b0, g0, r0 - значение для компоненты цвета нулевого пикселя, b1, g1, r1 - значение для компоненты цвета первого пикселя.

Формат изображения IPL может хранить и нечередующиеся цветовые данные, сначала все синие, потом красные, потом зеленые компоненты. И некоторые функции OpenCV могут с ними работать. Однако Createimage создает только изображения с чередующимися цветовыми данными. Эта функция является аналогом функции IPL:

iplCreateImageHeader( channels,
0,
depth,
channels == 1 ? "GRAY" : "RGB",
channels == 1 ? "GRAY" : channels == 3 ? "BGR" : channels == 4 ? "BGRA" : "",
IPL_DATA_ORDER_PIXEL,
IPL_ORIGIN_TL,
4,
size.width,
size.height,
0,0,0,0);

Однако она не использует функции IPL по умолчанию, см. макрос CV_TURN_ON_IPL_COMPATIBILITY.

ReleaseImage

Освобождает память, выделенную под изображение

Освобождает память, занимаемую данными заголовка и изображения.

void cvReleaseImage( IplImage** image );

image - двойной указатель на заголовок освобождаемого изображения.

ReleaseImage вызывает две функции:

if( *image )
{
cvReleaseData( *image );
cvReleaseImageHeader( image );
}

InitImageHeader

Инициализирует выделенный пользователем заголовок

IplImage* cvInitImageHeader( IplImage* image, CvSize size, int depth, int channels, int origin=0, int align=4 );

size - задает ширину и высоту изображения.

depth - задает битовую глубину элементов изображения. Может принимать значения:

   * IPL_DEPTH_8U - беззнаковые 8-битные целые (байт)
   * IPL_DEPTH_8S - 8 битные целые со знаком
   * IPL_DEPTH_16U - беззнаковые 16 - битные целые
   * IPL_DEPTH_16S - 16- битные целые со знаком
   * IPL_DEPTH_32S - 32 - битные целые со знаком
   * IPL_DEPTH_32F - плавающая точка одинарной точности
   * IPL_DEPTH_64F - плавающая точка двойной точности

channels - количество каналов на элемент (пиксел). Может быть 1,2,3 или 4. Каналы чередуются, например, обычное расположение цветовых данных в изображении такое - b0 g0 r0 b1 g1 r1 ... , где b0, g0, r0 - значение для компоненты цвета нулевого пикселя, b1, g1, r1 - значение для компоненты цвета первого пикселя.

origin - начало отсчета может быть IPL_ORIGIN_TL или IPL_ORIGIN_BL.

align - выравнивание для строк изображения, обычно 4 или 8 байт. Функция возвращает указатель на инициализированный заголовок.

CloneImage

Создает полную копию изображения, включая заголовок ROI и данные

IplImage* cvCloneImage( const IplImage* image );

image - клонируемое изображение

SetImageCOI

Устанавливает канал интереса (проще говоря, цветовой слой)

void cvSetImageCOI( IplImage* image, int coi );

image - входное изображение,

coi - номер канала.

coi = 0 - выбраны все каналы, coi = 1 выбран первый канал, и т.д. Если ROI равен NULL и coi не равен 0 выделяется ROI.

Замечание: Большинство функций OpenCV не поддерживают работу с COI, таким образом, чтобы работать с отдельными слоями изображений или матриц, рекомендуется использовать функции cvSplit для разложения на слои и cvPlaneToPix для сборки многослойного изображения.

GetImageCOI

Возвращает канал интереса (проще говоря, цветовой слой)

image - входное изображение возвращает канал интереса если возвращает 0 значит COI не назначен.

SetImageROI

Устанавливает область интереса на изображении

void cvSetImageROI( IplImage* image, CvRect rect );

image - входное изображение

rect - прямоугольник области интереса

Если ROI изображения равно NULL, а rect не равно прямоугольнику, равному всему изображению, создается ROI. В отличие от COI с ROI работает большинство функций OpenCV. В случае выделения на изображении области интереса, функции работающие с этим изображением видят лишь область интереса, и обрабатывают ее так, как если бы это было отдельное изображение. Координаты пикселей тоже отсчитываются как на нормальном изображении с началом координат в начале координат ROI.

ResetImageROI

Отменяет (освобождает память) ROI изображения

Отменяет (освобождает память) ROI изображения, после этого все изображение обабатывается функциями библиотеки.

Аналогичный результат может быть получен вызовом функций:

cvSetImageROI( image, cvRect( 0, 0, image->width, image->height ));
cvSetImageCOI( image, 0 );

Но последний вариант не освобождает image->roi.

GetImageROI

Возвращает координаты области интереса

CvRect cvGetImageROI( const IplImage* image );

image - входное изображение структура cvRect (0,0, image->width,image->height) возвращается когда ROI для данного изображения не задана.

CreateMat

Создает новую матрицу

CvMat* cvCreateMat( int rows, int cols, int type );

rows - количество строк в матрице

cols - количество столбцов в матрице

type - тип элементов матрицы обычно задаваемый в форме CV<глубина в битах>(S или U или F)C<количество каналов>, например: CV_8UC1 означает что матрица состоит из одного канала 8 битных беззнаковых целых элементов, а CV_32SC2 означает что в матрице 2 канала 32 битных значений со знаком. Функция выделяет память для заголовка матрицы и для данных, которые там будут содержаться. Аналогичные действия можно сделать вызвав функции:

CvMat* mat = cvCreateMatHeader( rows, cols, type );
cvCreateData( mat );

Элементы матрицы хранятся в памяти строка за строкой, все строки выровнены по 4 байтам.

CreateMatHeader

Создает заголовок матрицы

CvMat* cvCreateMatHeader( int rows, int cols, int type );

rows - количество строк в матрице

cols - количество столбцов в матрице

type - тип элементов матрицы обычно задаваемый в форме CV<глубина в битах>(S или U или F)C<количество каналов>, например: CV_8UC1 означает что матрица состоит из одного канала 8 битных беззнаковых целых элементов, а CV_32SC2 означает что в матрице 2 канала 32 битных значений со знаком. Выделяет память только для заголовка матрицы, но не для данных. Память для данных может быть выделена в дальнейшем при помощи функций: cvCreateData или может быть установлен указатель на уже существующий массив данных, при помощи функции cvSetData.

ReleaseMat

Освобождает память, занятую матрицей (данными и заголовком)

void cvReleaseMat( CvMat** mat );

mat - двойной указатель на матрицу.

Аналогичные действия могут быть выполнены командами:

if( *mat ) cvDecRefData( *mat );
cvFree( (void**)mat );

InitMatHeader

Инициализирует заголовок матрицы

CvMat* cvInitMatHeader( CvMat* mat, int rows, int cols, int type, void* data=NULL, int step=CV_AUTOSTEP );

mat - указатель на заголовок матрицы, который мы хотим инициализировать

rows - количество строк в матрице

cols - количество столбцов в матрице

type - тип элементов матрицы обычно задаваемый в форме CV<глубина в битах>(S или U или F)C<количество каналов>, например: CV_8UC1 означает что матрица состоит из одного канала 8 битных беззнаковых целых элементов, а CV_32SC2 означает что в матрице 2 канала 32 битных значений со знаком.

data - необязательный параметр, указывающий на данные. Назначается полная ширина строки в байтах. По умолчанию используется минимальный возможный шаг, то есть последовательные строки размещаются в памяти без проммежутков, одна за другой.

Функция InitMatHeader инициализирует только заголовок, под который уже выделена память.

Ниже приводится пример расчета матричного произведения.

//--------------------------------------------------------
double a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
double b[] = { 1, 5, 9, 2, 6, 10, 3, 7, 11, 4, 8, 12 };
 
double c[9];
CvMat Ma, Mb, Mc ;
 
cvInitMatHeader( &Ma, 3, 4, CV_64FC1, a );
cvInitMatHeader( &Mb, 4, 3, CV_64FC1, b );
cvInitMatHeader( &Mc, 3, 3, CV_64FC1, c );
 
cvMatMulAdd( &Ma, &Mb, 0, &Mc );
// массив c содержит произведение матриц a(3x4) и b(4x3)
//--------------------------------------------------------

Mat

Инициализирует заголовок матрицы (облегченный вариант)

CvMat cvMat( int rows, int cols, int type, void* data=NULL );

rows - количество строк в матрице

cols - количество столбцов в матрице

type - тип элементов матрицы обычно задаваемый в форме CV<глубина в битах>(S или U или F)C<количество каналов>, например: CV_8UC1 означает что матрица состоит из одного канала 8 битных беззнаковых целых элементов, а CV_32SC2 означает что в матрице 2 канала 32 битных значений со знаком.

data - необязательный параметр, указывающий на данные.

Размещает данные на которые указывает data строка за строкой.

Функция при компиляции заменяется inline подстановкой строк:

CvMat mat;
cvInitMatHeader( &mat, rows, cols, type, data, CV_AUTOSTEP );

CloneMat

Создает копию матрицы

CvMat* cvCloneMat( const CvMat* mat );

mat - входная матрица

Функция создает полную копию матрицы и возвращает на неё указатель.

CreateMatND

Cоздает многомерную плотную матрицу

CvMatND* cvCreateMatND( int dims, const int* sizes, int type );

dims - количество измерений массива должен быть меньше чем CV_MAX_DIM по умолчанию CV_MAX_DIM=32.

sizes - массив размеров измерений

type - тип элементов матрицы обычно задаваемый в форме CV<глубина в битах>(S или U или F)C<количество каналов>, например: CV_8UC1 означает что матрица состоит из одного канала 8 битных беззнаковых целых элементов, а CV_32SC2 означает что в матрице 2 канала 32 битных значений со знаком.

Функция CreateMatND выделяет память под заголовок многомерного плотного массива и его данных, после чего возвращает указатель на созданный массив. Те же действия можно выполнить вызвав функции:

CvMatND* mat = cvCreateMatNDHeader( dims, sizes, type );
cvCreateData( mat );

CreateMatNDHeader

Создает новый заголовок матрицы

CvMatND* cvCreateMatNDHeader( int dims, const int* sizes, int type );

dims - количество измерений матрицы

sizes - массив размеров измерений

type - тип элементов матрицы обычно задаваемый в форме CV<глубина в битах>(S или U или F)C<количество каналов>, например: CV_8UC1 означает что матрица состоит из одного канала 8 битных беззнаковых целых элементов, а CV_32SC2 означает что в матрице 2 канала 32 битных значений со знаком. Функция CreateMatNDHeader выделяет память под заголовок многомерной плотной матрицы. Память для данных может быть выделена позднее, при помощи функций cvCreateData или может быть установлен указатель на уже существующий массив данных, при помощи функции cvSetData.

ReleaseMatND

Освобождает память из под многомерной матрицы

void cvReleaseMatND( CvMatND** mat );

mat - двойной указатель на освобождаемую матрицу.

Аналогичный результат достигается вызовом функций:

if( *mat )
cvDecRefData( *mat );
cvFree( (void**)mat );

InitMatNDHeader

Инициализирует заголовок многомерной матрицы

CvMatND* cvInitMatNDHeader( CvMatND* mat, int dims, const int* sizes, int type, void* data=NULL );

mat - указатель на инициализируемый заголовок.

dims - количество измерений матрицы

sizes - массив размеров измерений

type - тип элементов матрицы обычно задаваемый в форме CV<глубина в битах>(S или U или F)C<количество каналов>, например: CV_8UC1 означает что матрица состоит из одного канала 8 битных беззнаковых целых элементов, а CV_32SC2 означает что в матрице 2 канала 32 битных значений со знаком. Функция InitMatNDHeader инициализирует структуру типа CvMatND под которую пользователем была выделена память.

CloneMatND

Создает полную копию многомерной матрицы

CvMatND* cvCloneMatND( const CvMatND* mat );

mat - копируемая матрица.

Функция CloneMatND - создает полную копию многомерной матрицы и возвращает указатель на неё.

DecRefData

Уменьшает на единицу счетчик ссылок на область памяти с данными

void cvDecRefData( CvArr* arr );

arr - заголовок матрицы

функция cvDecRefData уменьшает счетчик ссылок на данные структур CvMat и CvMatND если он не NULL и освобождает память занимаемую данными, если счетчик достигает значения 0. В текущей реализации счетчик ссылок на данные не равен NULL только если память под данные была выделена при помощи функции cvCreateData, во всех других случаях, таких как:

указатель назначен на внешние данные;

заголовок матрицы представляет собой часть бОльшей матрицы или изображения;

заголовок матрицы был сконвертирован из изображения или заголовка N-мерной матрицы,

счетчик ссылок на данные равен NULL и, следовательно, не уменьшается.

Всякий раз, освобождались данные или нет, указатель на данные и счетчики ссылок очищаются функцией.

IncRefData

Увеличивает на единицу счетчик ссылок на область памяти с данными

arr - заголовок матрицы функция cvIncRefData увеличивает счетчик ссылок на данные структур CvMat и CvMatND и возвращает его значение если он не NULL иначе возвращает 0.

CreateData

Выделяет в памяти место под данные матрицы

void cvCreateData( CvArr* arr );

arr - заголовок матрицы

функция cvCreateData выделяет память под данные изображения, матрицы или многомерной матрицы. Эта функция выделения памяти используется OpenCV в том случае, если выключена опция CV_TURN_ON_IPL_COMPATIBILITY, иначе используются функции из библиотеки IPL.

ReleaseData

Освобождает память занятую данными матрицы

void cvReleaseData( CvArr* arr );

arr - заголовок матрицы.

Функция cvReleaseData - освобождает память занятую данными матрицы в случае CvMat и CvMatND она просто вызывает cvDecRefData(), т.к. не может освободить память, выделенную отдельно, на которую просто потом был установлен указатель. Смотрите также замечания по cvCreateData.

SetData

Назначает указатель на данные заголовку матрицы

void cvSetData( CvArr* arr, void* data, int step );

arr - заголовок матрицы

data - указатель на данные

step - полная длина строки в байтах

Функция cvSetData назначает указатель на данные заголовку матрицы. Заголовок должен быть инициализирован перед использованием. Для этого можно применить функции:

cvCreate*Header, cvInit*Header или cvMat (в случае матрицы).

(* = Mat, MatND, и т.д.)

GetRawData

Возвращает низкоуровневую информацию о матрице

void cvGetRawData( const CvArr* arr, uchar** data, int* step=NULL, CvSize* roi_size=NULL );

arr - заголовок матрицы

data - (выходное значение) указатель на начало области памяти изображения (данных матрицы), или, если задана ROI, то на начало памяти ROI.

step - (выходное значение) полная длина строки в байтах.

roi_size - (выходное значение) размеры ROI (ширина и высота). Функция cvGetRawData заполняет выходные переменные информацией о данных изображения (матрицы). Все возвращаемые параметры необязательные и могут иметь значение NULL, если в них нет необходимости.

Пример показывает, как получить доступ к элементам матрицы, используя эту функцию.

Функция преобразует элементы матрицы в положительные (вычисляет абсолютные значения)

float* data;
int step;
 
CvSize size;
int x, y;
 
cvGetRawData( array, (uchar**)&data, &step, &size );
step /= sizeof(data[0]);
 
for( y = 0; y < size.height; y++, data += step )
for( x = 0; x < size.width; x++ )
    data[x] = (float)fabs(data[x]);

GetMat

Возвращает заголовок произвольной матрицы (прим. служит для преобразования IplImage или CvMatND в CvMat.)

CvMat* cvGetMat( const CvArr* arr, CvMat* header, int* coi=NULL, int allowND=0 );

arr - входная матрица.

header - указатель на структуру CvMat, используемую как временный буфер.

coi - необязательный выходной параметр для хранения канала интереса (COI).

AllowND - если не нуль функция принимает многомерные плотные матрицы (CvMatND*) и возвращает двумерные (если CvMAtND имеет два измерения) или одномерные (когда CvMatND имеет одно измерение или больше двух измерений). Матрица должна быть непрерывной.

Функция cvGetMat возвращает заголовок входной матрицы, которая может быть матрицей - CvMat, изображением IplImage или многомерным плотным массивом CvMatND* (если allowND!=0). В случае матрицы, функция просто возвращает на неё указатель (тот-же что передаем в параметрах), В случае изображения или CvMatND* она инициализирует структуру header параметрами текущей области интереса (ROI) и возвращает указатель на эту временную структуру. Так как канал интереса (COI) не поддерживается CvMat он возвращается отдельным параметром.

Функция обеспечивает простой путь управления обоими типами матриц - IplImage и CvMat путем использования одного и того же кода. Обратное преобразование из CvMat в IplImage осуществляется при помощи функции cvGetImage.

Входная матрица должна иметь выделенную область памяти для данных, то есть указатель на данные не должен быть NULL. Если входная матрица является IplImage с плоским расположением данных и установлен канал интереса (COI), функция возвращает указатель на текущую плоскость изображения и COI=0. Это позволяет обрабатывать многоканальные изображения с планарным расположением данных по плоскостям (каналам).

GetImage

Преобразует матрицу в изображение

arr - входная матрица

image_header - указатель на структуру IplImage, используемую как временный буфер.

Функция cvGetImage - возвращает заголовок изображения, для входной матрицы, которая может быть CvMat*, или изображением - IplImage*. В случае изображения, функция просто возвращает на него указатель. В случае CvMat* она инициализирует структуру image_header прамаметрами фходной матрицы.

Заметте, если мы преобразуем IplImage в CvMat и потом проводим обратное преобразование, мы можем получить различные заголовки, если установлна область интереса (ROI), и тогда, некоторые функции, которые вычисляют шаг по ширине и выравниванию могут не работать.

CreateSparseMat

Создает разреженную матрицу

CvSparseMat* cvCreateSparseMat( int dims, const int* sizes, int type );

dims - количество измерений матрицы. В отличие оот плотной матрицы, количество измерений практически неограничено (2^16).

sizes - массив размеров измерений.

type - тип элеменотов матрицы (см. CvMat).

Функция выделяет место под многомерную разреженную матрицу. Изначально массив не содержит элементов, и функции cvGet*D и cvGetReal*D возвращают 0 для любых индексов.

ReleaseSparseMat

Освобождает память от разреженной матрицы

void cvReleaseSparseMat( CvSparseMat** mat );

mat - двойной указатель на матрицу Функция очищает разреженную матрицу, затем очищает указатель.

CloneSparseMat

Создает полную копию разреженной матрицы

mat - копируемая матрица

CloneSparseMat - создает полную копию разреженной матрицы и возвращает указатель на копию.

 
Последние посты форума