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
Статья писалась давно и не может претендовать на актуальность для более новых версий библиотеки 😉