13. OpenCV шаг за шагом. Типы данных OpenCV

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;
}


Далее: 14. OpenCV шаг за шагом. Матрица
  • +1
  • 20 августа 2010, 09:44
  • noonv

Комментарии (3)

RSS свернуть / развернуть
+
0
Почти все нужные типы данных объявлены в заголовочном файле
OpenCV2.0\include\opencv\cvtypes.h


Объявления найдены здесь:
c:\opencv\build\include\opencv2\core\types_c.h
c:\opencv\modules\core\include\opencv2\core\types_c.h
avatar

malor

  • 26 сентября 2013, 13:54
+
0
Статья писалась давно и не может претендовать на актуальность для более новых версий библиотеки ;)
avatar

noonv

  • 26 сентября 2013, 15:54

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.