Sök…


Introduktion

Detta ämne täcker grundläggande strukturer i OpenCV. Strukturerna som kommer att diskuteras i detta ämne är DataType , Point , Vec , Size , Rect , Scalar , Ptr och Mat .

Data typ

De primitiva typerna i OpenCV är unsigned char, bool, signed char, unsigned short, signed short, int, float, double . Alla datatyper i OpenCV definieras som CV_<bit-depth>{U|S|F}C(<number_of_channels>) där U: unsigned , S:signed och F:floating point .

Exempelvis är CV_32FC2 en 32-bitars, flytande och 2-kanals struktur. och definitionen av grundläggande, en kanaltyper är

#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

De andra typerna med högre kanal produceras av dessa enligt följande definition:

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

Med hjälp av dessa datatyper kan andra strukturer skapas.

Matta

Mat (Matrix) är en n-dimensionell matris som kan användas för att lagra olika typer av data, till exempel RGB, HSV eller gråskalabilder, vektorer med verkliga eller komplexa värden, andra matriser etc.

En Mat innehåller följande information: width , height , type , channels , data , flags , datastart , dataend osv.

Den har flera metoder, några av dem är: create , copyTo , convertTo , isContinious etc.

Det finns många sätt att skapa en matvariabel. Tänk på att jag vill skapa en matris med 100 rader, 200 kolumner, typ 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

Initiera matta:

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) är en mallklass för numeriska värden. Till skillnad från c++ vector lagrar den i allmänhet korta vektorer (endast några få element).

Hur en Vec definieras är som följer:

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

där typen är en av uchar, short, int, float, double och tecknen för varje typ är b, s, i, f, d , respektive.

Till exempel indikerar Vec3b en osignerad rödavektor på 3 kanaler. Varje index i en RGB-bild är i detta 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].

I Vec klassen definieras följande operatörer

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

För mer information, se länken



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow