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;
}