Mat clase introdujo en OPENCV
Directorio artículo
- Mat clase introdujo en OPENCV
- Perfil 1. Mat Clase
- 2. Copia de clase Mat
- clase 3.Mat para crear una matriz
- 3.1Mat clase para crear una matriz de dos dimensiones
- Mat clase utilizando el constructor es
- Crear una matriz utilizando la función de miembro de crear
- MATLAB tipo de matriz para crear
- Crear una matriz, separados por comas
- 3.2Mat clase para crear una matriz multidimensional
- 4.Mat clase de salida con formato
Perfil 1. Mat Clase
clase Mat es una estructura de datos de imagen muy común almacenada OPENCV. Mat clase de almacenamiento de contenedores puede ser vista como una matriz, que contiene dos partes, que se utilizan para almacenar la información de cabecera de imagen, y un puntero que apunta a las imágenes de matriz almacenados. Información a menudo espacio de cabeza es relativamente pequeña, y el jefe de información entre cada imagen es completamente independiente. La matriz de la imagen a menudo ocupan un gran espacio de almacenamiento, y el puntero de matriz puede apuntar a la misma imagen de una pluralidad de espacio de memoria.
2. Copia de clase Mat
estructura Mat desde un punto de clases de vista de almacenamiento de datos, memoria de imagen puntero clase Mat es implementada por una matriz. En este caso, un problema al hacer la copia de una imagen cuando es necesario tener en cuenta es: tenemos que copiar el puntero de dirección es una matriz, o la necesidad de volver a crear una memoria, la matriz de memoria de imagen a re-copia. Por lo tanto la clase Mat tener una copia superficial de copiar y copia completa de dos tipos.
constructor de copia 2.1 copia
Mat clase tiene su propio constructor de copia, que sigue el prototipo de función
Mat(const Mat& m);
Copia mediante el constructor de copia, hay dos escritura de la imagen, y escribir los dos son equivalentes.
Mat m = imread("1.jpg);
Mat m1 = m;
Mat m2(m);
Utilizando el constructor de copia superficial copia es una copia de la imagen, como resultado, M1 y M2 no tienen su propio almacenamiento de imágenes independientes, sino a su puntero de matriz para la dirección de puntero m. Por lo tanto, cuando tenemos que operar m, m1, también se verán afectados m2 tres fotos de una de las otras dos imágenes, el siguiente código de prueba:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main()
{
//创建了Mat类型的变量m,并且通过拷贝构造的方法拷贝到了变量m1和m2
Mat m = imread("a.jpg");
Mat m1 = m;
Mat m2(m);
//创建了矩阵r和向量s,用于在图m1上绘图
Rect r(0, 0, 300, 300);
Scalar s(255, 0, 255);
rectangle(m1, r, s);
//显示所有的三张图片
imshow("m", m);
imshow("m1", m1);
imshow("m2", m2);
waitKey(0);
return 0;
}
Los resultados son los siguientes:
2,2 clone () la función o la función copyTo () para copiar
El uso de estos dos métodos de copia es una copia completa de la imagen se genera la matriz de almacenamiento de imágenes independiente, y los datos de imagen original no es común, en cuyo caso, una sola operación, el otro no se ve afectada, la desventaja es el gran espacio y más lento.
Redactado como sigue:
Mat m = imread("a.jpg");
Mat m1;
m.copyTo(m1);
Mat m2=m.clone();
Código de ensayo:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main()
{
//创建了Mat类型的变量m,并且拷贝到了变量m1和m2
Mat m = imread("a.jpg");
Mat m1;
m.copyTo(m1);
Mat m2=m.clone();
//创建了矩阵r和向量s,用于在图m1上绘图
Rect r(0, 0, 300, 300);
Scalar s(255, 0, 255);
rectangle(m, r, s);
//显示所有的三张图片
imshow("m", m);
imshow("m1", m1);
imshow("m2", m2);
waitKey(0);
return 0;
}
clase 3.Mat para crear una matriz
Dado que la estera de Clase A en sí Matrix es un tipo de tratamiento, puede ser creado a través de la clase matriz MAT
3.1Mat clase para crear una matriz de dos dimensiones
Mat clase utilizando el constructor es
Hay muchos constructor de la clase Mat se utiliza para crear la configuración de la matriz, y dado la asignación, Esto introduce una distancia, que se define como una función
Mat(int rows, int cols, int type, const Scalar& s);
Este constructor toma cuatro parámetros, que se caracteriza por la capacidad de definir una estructura de matriz y capaces de impartir inicial
El primer parámetro indica el número de filas en la matriz
el segundo argumento indica el número de columnas de la matriz de
la tercera parámetro indica el tipo de datos almacenados en una matriz, que tiene la CV_ formato [bits de] [con o sin signo] [Tipo de datos] [número de canal], como
CV_8UC3 //表示存储数据为8位无符号char类型,并且具有三个通道
El cuarto parámetro es una variable de tipo vectorial, puede dar matriz de inicialización, este vector tiene hasta cuatro dimensiones.
Ejemplo de uso:
Mat m(3, 3, CV_8UC3, Scalar(100, 10, 0));
Crear una matriz utilizando la función de miembro de crear
Crear una matriz usando este método para abrir sólo un recuerdo, pero no puede inicialización
Mat m;
m.create(3, 3, CV_8UC3);
MATLAB tipo de matriz para crear
clase Mat tiene función de tres estática del ojo (), ceros (), los () para crear una matriz con el mismo nombre en el MATLAB uso de función similar
, debido a que es funciones estáticas, para que puedan ser separados de los ejemplos específicos del objeto existe, llamados cuando es precedido por el nombre pertenece a la clase llamada, se utiliza de la siguiente manera
Mat E = Mat::eye(4, 4, CV_32F);
Mat Z = Mat::zeros(4, 4, CV_32F);
Mat O = Mat::ones(4, 4, CV_32F);
salida:
Crear una matriz, separados por comas
Si la matriz es relativamente pequeña, se pueden introducir de esta manera, algo similar a la forma en que cada número que entró
Mat C =(Mat_<double>(3,3)<<1,1,1,1,1,1,1,1,1);
3.2Mat clase para crear una matriz multidimensional
Además clase Mat a la creación de matriz de dos dimensiones como en el ejemplo anterior, también se pueden crear mediante la definición de una dimensión de un método de la matriz multidimensional, esta función de configuración se define como sigue:
Mat(int ndims, const int* sizes, int type, const Scalar& s);
El primer parámetro es la dimensión de la matriz, tales como escribir una matriz tridimensional representa
un segundo parámetro es un puntero de tipo int, datos que representan la longitud de cada dimensión es el número de
la tercera parámetro indica el tipo de datos almacenados es lo que
el cuarto parámetro utilizado para impartir un valor inicial
Utilice la siguiente manera:
int size[3]={3,3,3};
Mat(3,size,CV_8UC3,Scalar::all(0));
4.Mat clase de salida con formato
clase de salida con formato Mat se limita a una matriz de dos dimensiones. O bien, el uso de cout tipos Mat salida de las variables, sólo dos dimensiones. Aquí sólo algunos ejemplos.
4.1 El formato predeterminado
Mat m=Mat::zeros(5,5,CV_64F);
cout<<m<<endl;
4.2 Formato de pitón
Mat m = Mat::zeros(5, 5, CV_64F);
cout << format(m,Formatter::FMT_PYTHON)<< endl<<endl;
4.3 formato de lenguaje C
Mat m = Mat::zeros(5, 5, CV_64F);
cout << format(m, Formatter::FMT_C) << endl << endl;
4.4 Formato de numpy
Mat m = Mat::zeros(5, 5, CV_64F);
cout << format(m, Formatter::FMT_NUMPY) << endl<<endl;