2021.3.27Operación de objetos OpenCV04Mat-Copiar imagen y clonar-Convertir a espacio en escala de grises-Mostrar el valor de píxeles-Mostrar filas y columnas

2021.3.27 Operación del objeto OpenCV04Mat: copiar y clonar la imagen, girar el espacio en escala de grises, mostrar el valor del píxel, mostrar los rangos, crear un objeto mat en el método de creación
l La estructura de datos de imagen introducida después de OpenCV2.0 del objeto Mat , asigna memoria automáticamente, no tiene el problema de pérdida de memoria y es una estructura de datos orientada a objetos. Dividido en dos partes, el encabezado y la parte de datos
L IplImage de 2001 Nian OpenCV después de que el lanzamiento ha existido, es una estructura de datos al estilo del lenguaje C , los desarrolladores necesitan su propia asignación de memoria y administración de programas grandes para usarlo, lo que conduce fácilmente a pérdidas de memoria
Uso de objetos de tapete
 
l Copia parcial: en general, solo se copiará la parte del encabezado y el puntero del objeto Mat , y la parte de datos no se copiará

Mat A = imread ( imgFilePath );

Mat B (A) // Solo copia

l Copia completa: si desea copiar el encabezado y la parte de datos del objeto Mat juntos, puede usar las siguientes dos API para lograr

Mat F = A. clon ();Mat G; A.copyTo (G);

 

l
 
 
 

Uso de objetos de tapete : cuatro puntos

 

l La memoria de la imagen de salida se asigna automáticamente
l Utilice la interfaz C ++ de OpenCV , no es necesario considerar problemas de asignación de memoria
l Las operaciones de asignación y los constructores de copia solo copiarán la parte del encabezado
l Utilice clonar y copiar a dos funciones para lograr una copia de datos completa
 
 

                                    Creación de objetos de tapete

                      

l cv :: Mat :: Constructor de mat

  Mat M (2,2, CV_8UC3, Escalar (0,0,255))

  Donde los dos primeros parámetros representan la fila (Fila) con la fila (columna) , el tercer CV_8UC3 en 8 representa cada canal que representa 8 bits, el U- sin signo, C denota el tipo Char , 3 representa el número de canales es 3 , el primero Los cuatro parámetros son vectores que indican cuánto se inicializa cada valor de píxel y la longitud del vector corresponde al número de canales.

 

l Cree una matriz multidimensional cv :: Mat :: create

   int sz [3] = {2,2,2};    

  Mat L (3, sz, CV_8UC1, Scalar :: all (0));

 

 



//txwtech 2021.3
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main(int argc, char *argv[])
{
	Mat src;
	src = imread("E:/pictures/test1.jpg");
	if (src.empty())
	{
		cout << "cannot load img" << endl;
		return -1;
	}
	namedWindow("in",CV_WINDOW_AUTOSIZE);
	imshow("in",src);

	Mat dst;
	dst = Mat(src.size(), src.type());//创建一个与src大小与类型一样的Mat对象
	dst = Scalar(127,0,255);//创建一个纯颜色的图像
	namedWindow("out",CV_WINDOW_AUTOSIZE);
	imshow("out",dst);

	//克隆,完全拷贝,一模一样的
	Mat dst2;
	//dst2 = src.clone();
	src.copyTo(dst2);

	cvtColor(src,dst2,CV_RGB2GRAY);//转换为灰度空间

	printf("in img channels:%d\n",src.channels());//显示有多少个通道
	printf("out img channels:%d\n", dst2.channels());

	namedWindow("out2", CV_WINDOW_AUTOSIZE);
	imshow("out2", dst2);
	
	//通过指针访问图像
	const uchar* firstRow = dst2.ptr<uchar>(0);
	printf("first pixel value:%d\n",*firstRow);//显示第一个像素点的值
	
	//显示有多少行和列,宽与高
	int cols = dst.cols;
	int rows = dst.rows;
	printf("rows:%d...cols:%d...\n",rows,cols);

	//定义一个红色
	Mat M(100, 100, CV_8UC3, Scalar(0,0,255));//行与列都是100的长度的红色图片
	//Scalr里面的参数个数与前面一个保持一致,目前3个,对应CV_8UC3
	//Mat M(100, 100, CV_8UC1, Scalar(127));//表示灰度图像。目前1个,对应CV_8UC1
											  
	
	//cout << "M=" << endl << M << endl;

	//create方式创建Mat对象
	Mat M2;
	M2.create(src.size(),src.type());
	M2 = Scalar(0, 0, 255);//创建一个与原图像大小一致的,红色图像

	//掩膜,提高对比度
	Mat csrc;
	Mat kernel = (Mat_<char>(3,3)<<0,-1,0,-1,5,-1,0,-1,0);
	filter2D(src, csrc,-1,kernel);
	namedWindow("out3", CV_WINDOW_AUTOSIZE);
	


	//全部初始化为全黑色的图片
	Mat M3 = Mat::zeros(src.size(),src.type());
	imshow("out3", M3);

	Mat m5 = Mat::zeros(2,2,CV_8UC1);
	cout << "m5=" << endl << m5 << endl;
	Mat m6 = Mat::eye(2,2,CV_8UC1);
	cout << "m6=" << endl << m6 << endl;//运行查看实际效果

	waitKey(0);
	return 0;
}

 

Supongo que te gusta

Origin blog.csdn.net/txwtech/article/details/115272507
Recomendado
Clasificación