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>)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



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow