Для своей работы, OpenCV использует несколько различных типов данных. Структуру изображения — IplImage мы уже видели, а теперь рассмотрим другие самые часто используемые форматы.
Почти все нужные типы данных объявлены в заголовочном файле OpenCV2.0\include\opencv\cvtypes.h
Типы данных начинаются с заглавной «С», а их конструкторы (которые на самом деле — инлайновые функции) имеют название совпадающее с названием данных, только их название вместо большой «С» начинается с маленькой «с».
(Некоторые типы данных (например, CvScalar) имеют несколько конструкторов.)
Итак: CvPoint — точка — (структура из двух переменных (x,y)) CvSize — размер — (структура из двух переменных (width,height)) CvRect — прямоугольник — (структура из 4 переменных (x,y,width,height)) CvScalar — скаляр — (4 числа типа double)
CvArr — массив — его можно считать «абстрактным базовым классом» для CvMat и далее IplImage (CvArr->CvMat->IplImage)
typedef void CvArr;
CvMat — матрица IplImage — изображение
Вы уже, наверное, обратили внимание, что прототипы функций OpenCV принимают в качестве параметров указатель на CvArr. Фактически это означает, что они принимают массив CvMat* или изображение IplImage*.
Ниже представлены структуры данных и их конструкторы. Как видите — всё очень просто:
//
// точка
//
typedef struct CvPoint
{
int x;
int y;
}
CvPoint;
//
// конструктор:
//
CV_INLINE CvPoint cvPoint( int x, int y )
{
CvPoint p;
p.x = x;
p.y = y;
return p;
}
//
// точка типа float
//
typedef struct CvPoint2D32f
{
float x;
float y;
}
CvPoint2D32f;
//
// трёхмерная точка
//
typedef struct CvPoint3D32f
{
float x;
float y;
float z;
}
CvPoint3D32f;
//
// точка типа double
//
typedef struct CvPoint2D64f
{
double x;
double y;
}
CvPoint2D64f;
typedef struct CvPoint3D64f
{
double x;
double y;
double z;
}
CvPoint3D64f;
//
// размер
//
typedef struct
{
int width;
int height;
}
CvSize;
//
// конструктор:
//
CV_INLINE CvSize cvSize( int width, int height )
{
CvSize s;
s.width = width;
s.height = height;
return s;
}
typedef struct CvSize2D32f
{
float width;
float height;
}
CvSize2D32f;
//
// прямоугольник
//
typedef struct CvRect
{
int x;
int y;
int width;
int height;
}
CvRect;
//
// конструктор:
//
CV_INLINE CvRect cvRect( int x, int y, int width, int height )
{
CvRect r;
r.x = x;
r.y = y;
r.width = width;
r.height = height;
return r;
}
//
// скаляр
//
typedef struct CvScalar
{
double val[4];
}
CvScalar;
//
// конструкторы:
//
// каждый элемент задаётся отдельно
CV_INLINE CvScalar cvScalar( double val0, double val1 CV_DEFAULT(0),
double val2 CV_DEFAULT(0), double val3 CV_DEFAULT(0))
{
CvScalar scalar;
scalar.val[0] = val0; scalar.val[1] = val1;
scalar.val[2] = val2; scalar.val[3] = val3;
return scalar;
}
CV_INLINE CvScalar cvRealScalar( double val0 )
{
CvScalar scalar;
scalar.val[0] = val0;
scalar.val[1] = scalar.val[2] = scalar.val[3] = 0;
return scalar;
}
// все элементы принимают одинаковое значение
CV_INLINE CvScalar cvScalarAll( double val0123 )
{
CvScalar scalar;
scalar.val[0] = val0123;
scalar.val[1] = val0123;
scalar.val[2] = val0123;
scalar.val[3] = val0123;
return scalar;
}
Функции конвертации точек:
// конвертирует целочисленную точку в точку типа float
CV_INLINE CvPoint2D32f cvPointTo32f( CvPoint point )
{
return cvPoint2D32f( (float)point.x, (float)point.y );
}
// конвертирует точку типа float в целочисленную точку
CV_INLINE CvPoint cvPointFrom32f( CvPoint2D32f point )
{
CvPoint ipt;
ipt.x = cvRound(point.x);
ipt.y = cvRound(point.y);
return ipt;
}
Комментарии (3)
RSS свернуть / развернутьОбъявления найдены здесь:
c:\opencv\build\include\opencv2\core\types_c.h
c:\opencv\modules\core\include\opencv2\core\types_c.h
malor
noonv
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.