1. OpenCV шаг за шагом. Введение.
2. Установка.
3. Hello World.
4. Загрузка картинки.
5. Вывод видео
6. Ползунок
7. Захват видео с камеры
8. Запись видео
9. События от мышки
10. Обработка изображения — сглаживание
11. Обработка изображения — изменение размеров
12. ROI — интересующая область изображения
13. Типы данных OpenCV
Для своей работы, 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;
}

0 комментариев на «“13. OpenCV шаг за шагом. Типы данных OpenCV”»
Объявления найдены здесь:
c:\opencv\build\include\opencv2\core\types_c.h
c:\opencv\modules\core\include\opencv2\core\types_c.h
Статья писалась давно и не может претендовать на актуальность для более новых версий библиотеки 😉