CraftDuino v2.0
  • - это CraftDuino - наш вариант полностью Arduino-совместимой платы.
  • CraftDuino - настоящий конструктор, для очень быстрого прототипирования и реализации идей.
  • Любая возможность автоматизировать что-то с лёгкостью реализуется с CraftDuino!
Просто добавьте CraftDuino!

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

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