opencv
Grundläggande strukturer
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