Ricerca…


introduzione

Questo argomento riguarda le strutture di base in OpenCV. Le strutture che verranno discusse in questo argomento sono DataType , Point , Vec , Size , Rect , Scalar , Ptr e Mat .

Tipo di dati

I tipi primitivi in ​​OpenCV sono unsigned char, bool, signed char, unsigned short, signed short, int, float, double . Qualsiasi tipo di dati in OpenCV è definito come CV_<bit-depth>{U|S|F}C(<number_of_channels>) dove U: unsigned , S:signed e F:floating point .

Ad esempio, CV_32FC2 è una struttura a 32 bit, a virgola mobile e a 2 canali. e la definizione di base, i tipi di un canale sono

#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

Gli altri tipi con canale più alto sono prodotti da questi dalla seguente definizione:

#define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))

Usando questi tipi di dati è possibile creare altre strutture.

Stuoia

Mat (Matrix) è un array n-dimensionale che può essere utilizzato per memorizzare vari tipi di dati, come immagini RGB, HSV o in scala di grigi, vettori con valori reali o complessi, altre matrici, ecc.

Un Mat contiene le seguenti informazioni: width , height , type , channels , data , flags , datastart , dataend e così via.

Ha diversi metodi, alcuni dei quali sono: create , copyTo , convertTo , isContinious ecc.

Ci sono molti modi per creare una variabile Mat. Considera che voglio creare una matrice con 100 righe, 200 colonne, tipo 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

Tappetino di inizializzazione:

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) è una classe template per valori numerici. A differenza dei c++ vector , generalmente memorizza i vettori brevi (solo alcuni elementi).

Il modo in cui un Vec è definito è il seguente:

 typedef Vec<type, channels> Vec< channels>< one char for the type>;

dove type è uno di uchar, short, int, float, double e i caratteri per ogni tipo sono b, s, i, f, d , rispettivamente.

Ad esempio, Vec3b indica un vettore char senza segno di 3 canali. Ogni indice in un'immagine RGB è in questo formato.

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].

Nella classe Vec sono definiti i seguenti operatori

v1 = v2 + v3
v1 = v2 - v3
v1 = v2 * scale
v1 = scale * v2
v1 = -v2
v1 += v2 and other augmenting operations
v1 == v2, v1 != v2

Per ulteriori informazioni, consultare il link



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow