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 шаг за шагом. Матрица


0 комментариев на «“13. OpenCV шаг за шагом. Типы данных OpenCV”»

  1. Почти все нужные типы данных объявлены в заголовочном файле
    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

    • Статья писалась давно и не может претендовать на актуальность для более новых версий библиотеки 😉

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Arduino Bluetooth CraftDuino DIY Google IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение