2021.3.27OpenCV04Mat对象的操作-图像复制克隆-转灰度空间-显示像素点的值-显示行列

2021.3.27OpenCV04Mat对象的操作-图像复制克隆-转灰度空间-显示像素点的值-显示行列-create方式创建mat对象
l Mat 对象 OpenCV2.0 之后引进的图像数据结构、自动分配内存、不存在内存泄漏的问题,是面向对象的数据结构。分了两个部分,头部与数据部分
l IplImage 是从 2001 OpenCV 发布之后就一直存在,是 C 语言风格的数据结构,需要开发者自己分配与管理内存,对大的程序使用它容易导致内存泄漏问题
Mat 对象使用
 
l 部分复制:一般情况下只会复制 Mat 对象的头和指针部分,不会复制数据部分

Mat A= imread(imgFilePath);

Mat B(A)  // 只复制

l 完全复制:如果想把 Mat 对象的头部和数据部分一起复制,可以通过如下两个 API 实现

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

 

l
 
 
 

Mat对象使用-四个要点

l 输出图像的内存是自动分配的
l 使用 OpenCV C++ 接口,不需要考虑内存分配问题
l 赋值操作和拷贝构造函数只会复制头部分
l 使用 clone copyTo 两个函数实现数据完全复制
 
 

                                    Mat对象创建

                      

l cv ::Mat::Mat 构造函数

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

  其中前两个参数分别表示行(row)跟列(column)、第三个CV_8UC3中的8表示每个通道占8位、U表示无符号、C表示Char类型、3表示通道数目是3,第四个参数是向量表示初始化每个像素值是多少,向量长度对应通道数目一致

 

l 创建多维数组 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;
}

猜你喜欢

转载自blog.csdn.net/txwtech/article/details/115272507