opencv
Основные структуры
Поиск…
Вступление
В этом разделе рассматриваются основные структуры OpenCV. Структуры, которые будут обсуждаться в этом разделе, это DataType , Point , Vec , Size , Rect , Scalar , Ptr и Mat .
Тип данных
Примитивными типами в OpenCV являются unsigned char, bool, signed char, unsigned short, signed short, int, float, double . Любой тип данных в OpenCV определяется как CV_<bit-depth>{U|S|F}C(<number_of_channels>) где U: unsigned , S:signed и F:floating point .
Например, CV_32FC2 представляет собой 32-битную, с плавающей точкой и 2-канальную структуру. и определение базового, одного типа каналов
#define CV_8U 0
#define CV_8S 1
#define CV_16U 2
#define CV_16S 3
#define CV_32S 4
#define CV_32F 5
#define CV_64F 6
#define CV_USRTYPE1 7
Другие типы с более высоким каналом получают из них следующим определением:
#define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))
Используя эти типы данных, могут быть созданы другие структуры.
Мат
Mat (Matrix) - это n-мерный массив, который может использоваться для хранения различных типов данных, таких как изображения RGB, HSV или оттенки серого, векторы с реальными или сложными значениями, другие матрицы и т. Д.
Mat содержит следующую информацию: width , height , type , channels , data , flags , datastart , dataend и так далее.
Он имеет несколько методов, некоторые из них: create , copyTo , convertTo , isContinious и т. Д.
Существует множество способов создания переменной Mat. Рассмотрим, что я хочу создать матрицу со 100 строками, 200 столбцами, тип CV_32FC3:
int R = 100, C = 200;
Mat m1; m1.create(R,C,CV_32FC3);//creates empty matrix
Mat m2(cv::Size(R, C), CV_32FC3); // creates a matrix with R rows, C columns with data type T where R and C are integers,
Mat m3(R,C,CV_32FC3); // same as m2
Инициализация Mat:
Mat m1 = Mat::zeros(R,C,CV_32FC3); // This initialized to zeros, you can use one, eye or cv::randn etc.
Mat m2(R,C,CV_32FC3);
for (int i = 0; i < m2.rows; i++)
for (int j = 0; j < m2.cols; j++)
for (int k = 0; k < m2.channels(); k++)
m2.at<Vec3f>(i,j)[k] = 0;
//Note that, because m2 is a float type and has 3 channels, we used Vec3f, for more info see Vec
Mat m3(3, out, CV_32FC1, cv::Scalar(0));
Vec
Vec (Vector) - это шаблонный шаблон для численных значений. В отличие от c++ vector s, он обычно хранит короткие векторы (всего несколько элементов).
Способ определения Vec следующий:
typedef Vec<type, channels> Vec< channels>< one char for the type>;
где type - один из uchar, short, int, float, double а символы для каждого типа - b, s, i, f, d соответственно.
Например, Vec3b указывает беззнаковый вектор символов из 3-х каналов. Каждый индекс в RGB-изображении находится в этом формате.
Mat rgb = imread('path/to/file', CV_LOAD_IMAGE_COLOR);
cout << rgb.at<Vec3b>(0,0); //The output is [r g b] values as ASCII character.
// To print integer values of RED value
cout << (int)rgb.at<Vec3b>(0,0)[0]; //The output will be an integer in [0, 255].
В классе Vec определены следующие операторы
v1 = v2 + v3
v1 = v2 - v3
v1 = v2 * scale
v1 = scale * v2
v1 = -v2
v1 += v2 and other augmenting operations
v1 == v2, v1 != v2
Для получения дополнительной информации см. Ссылку