opencv
Grundstrukturen
Suche…
Einführung
Dieses Thema behandelt grundlegende Strukturen in OpenCV. Die Strukturen, die in diesem Thema behandelt werden, sind DataType
, Point
, Vec
, Size
, Rect
, Scalar
, Ptr
und Mat
.
Datentyp
Die primitiven Typen in OpenCV sind unsigned char, bool, signed char, unsigned short, signed short, int, float, double
. Jeder Datentyp in OpenCV ist definiert als CV_<bit-depth>{U|S|F}C(<number_of_channels>)
wobei U: unsigned
, S:signed
und F:floating point
.
Beispielsweise ist CV_32FC2
eine 32-Bit-, Gleitkomma- und 2-Kanal-Struktur. und die Definition der grundlegenden, einen Kanaltypen sind
#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
Die anderen Typen mit höherem Kanal werden durch folgende Definition aus diesen erzeugt:
#define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))
Mit diesen Datentypen können andere Strukturen erstellt werden.
Matte
Mat
(Matrix) ist ein n-dimensionales Array, das zum Speichern verschiedener Datentypen verwendet werden kann, beispielsweise RGB-, HSV- oder Graustufenbilder, Vektoren mit reellen oder komplexen Werten, andere Matrizen usw.
Eine Mat
enthält die folgenden Informationen: width
, height
, type
, channels
, data
, flags
, datastart
, dataend
usw.
Es gibt mehrere Methoden, einige davon sind: create
, copyTo
, convertTo
, isContinious
usw.
Es gibt viele Möglichkeiten, eine Mat-Variable zu erstellen. Angenommen, ich möchte eine Matrix mit 100 Zeilen und 200 Spalten erstellen, geben Sie CV_32FC3 ein:
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
Initialisierungsmatte:
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) ist eine Vorlagenklasse für numerische Werte. Im Gegensatz zu c++ vector
speichert es im Allgemeinen kurze Vektoren (nur wenige Elemente).
Ein Vec
wird folgendermaßen definiert:
typedef Vec<type, channels> Vec< channels>< one char for the type>;
Dabei ist Typ einer der uchar, short, int, float, double
und die Zeichen für jeden Typ sind b, s, i, f, d
.
Beispielsweise gibt Vec3b
einen vorzeichenlosen Vec3b
von 3 Kanälen an. Jeder Index in einem RGB-Bild hat dieses 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].
In der Klasse Vec
die folgenden Operatoren definiert
v1 = v2 + v3
v1 = v2 - v3
v1 = v2 * scale
v1 = scale * v2
v1 = -v2
v1 += v2 and other augmenting operations
v1 == v2, v1 != v2
Weitere Informationen finden Sie unter dem Link