opencv
Structures de base
Recherche…
Introduction
Cette rubrique couvre les structures de base dans OpenCV. Les structures qui seront abordées dans cette rubrique sont DataType
, Point
, Vec
, Size
, Rect
, Scalar
, Ptr
et Mat
.
Type de données
Les types primitifs dans OpenCV sont unsigned char, bool, signed char, unsigned short, signed short, int, float, double
. Tout type de données dans OpenCV est défini comme CV_<bit-depth>{U|S|F}C(<number_of_channels>)
où U: unsigned
, S:signed
et F:floating point
.
Par exemple, CV_32FC2
est une CV_32FC2
32 bits, à virgule flottante et 2 canaux. et la définition de base, les types de canal sont
#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
Les autres types avec un canal plus élevé sont produits à partir de ceux-ci par la définition suivante:
#define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))
En utilisant ces types de données, d'autres structures peuvent être créées.
Tapis
Mat
(Matrix) est un tableau à n dimensions qui peut être utilisé pour stocker différents types de données, telles que des images RVB, HSV ou en niveaux de gris, des vecteurs avec des valeurs réelles ou complexes, d'autres matrices, etc.
Un Mat
contient les informations suivantes: width
, height
, type
, channels
, data
, flags
, datastart
, dataend
, etc.
Il a plusieurs méthodes, certaines sont: create
, copyTo
, convertTo
, isContinious
etc.
Il existe plusieurs façons de créer une variable Mat. Considérez que je veux créer une matrice avec 100 lignes, 200 colonnes, tapez 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
Tapis d'initialisation:
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) est une classe de modèle pour les valeurs numériques. Contrairement au c++ vector
, il stocke généralement des vecteurs courts (quelques éléments seulement).
La façon dont un Vec
est défini est la suivante:
typedef Vec<type, channels> Vec< channels>< one char for the type>;
où type est l'un des uchar, short, int, float, double
et les caractères de chaque type sont respectivement b, s, i, f, d
.
Par exemple, Vec3b
indique un vecteur char non signé de 3 canaux. Chaque index d'une image RVB est dans ce format.
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].
Dans la classe Vec
, les opérateurs suivants sont définis
v1 = v2 + v3
v1 = v2 - v3
v1 = v2 * scale
v1 = scale * v2
v1 = -v2
v1 += v2 and other augmenting operations
v1 == v2, v1 != v2
Pour plus d'informations, voir le lien