OpenCV-图像处理(03、Mat对象)
Mat对象与IplImage对象
- Mat对象 OpenCV2.0之后引进的图像数据结构、自动分配内存、不存在内存泄漏的问题,是面向对象的数据结构。分了两个部分,头部与数据部分
- IplImage 是从2001年OpenCV发布之后就一直存在,是C语言风格的数据结构,需要开发者自己分配与管理内存,对大的程序使用它容易导致内存泄漏问题
Mat对象使用
Mat对象构造函数
构造函数(部分常用的) | 说明 |
---|---|
Mat(); | 无参构造方法 |
Mat(int rows, int cols, int type); | 创建行数为rows,列数为cols,类型为type的图像 |
Mat(Size size, int type); | 创建大小为size,类型为type的图像 |
Mat(int rows, int cols, int type, const Scalar& s); | 创建行数为rows,列数为cols,类型为type的图像,并且将所有元素初始化为s |
Mat(Size size, int type, const Scalar& s); | 创建大小为size,类型为type的图像,并且将所有元素初始化为值s |
Mat(int ndims, const int* sizes, int type); | |
Mat(int ndims, const int* sizes, int type, const Scalar& s); | |
Mat(const Mat& m) | 将m赋值给新创建的对象,此处不会对图像数据进行复制,m和新对象共用图像数据 |
其中:type可以是:CV_8UC1、CV_16SC1、… … 、CV_64FC3 等。C[The channel number]、U(unsigned integer)表示的是无符号整数,S(signed integer)是有符号整数, F(float)是浮点数。
里面的 8U 表示8位无符号整数(0 ~ 255),16S 表示16位有符号整数(-32768 ~ 32767),64F 表示64位浮点 double数据类型,C后面的数表示通道数,例如:C1表示一个通道数的图像,C3表示3通道图像,以此类推。
#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>using namespace std;
using namespace cv;int main(int argc,char** argv){Mat src;src=imread("E:/Experiment/OpenCV/Pictures/dog2.jpg");if(!src.data){cout<<"Could not load image ... "<<endl;return -1;}//构造函数示例Mat dst1(250,250,CV_8UC1);//创建200行200列类型为8位单通道矩阵Mat dst2(Size(250,250),CV_8UC3);//创建300行400列类型为8位3通道矩阵// CV_8UC1 8表示8位,UC表示unsigned char,1表示1个通道, Scalar表示向量长度,要与通道数目一致Mat dst3(300, 300, CV_8UC3, Scalar(0, 0, 255));//3*3个像素点,CV_8UC3表示像素点为三个通道颜色数据,CV_8UC1表示像素点为单通道,对应的传 Scalar(255) Mat dst4(Size(300,300),CV_8UC1,Scalar(127));//500*500个像素点,CV_32FC2表示32位浮点型数据,2通道图像,127表示灰色Mat dst5(src);//将src赋值给dst1,共用数据对象Mat dst6 = Mat(src.size(), src.type());dst6 = Scalar(127, 0, 255);//给矩阵所有的像素点设置颜色数据,绯红,这里的 = 号运算符重载了。Scalar参数顺序是 B G RnamedWindow("input",CV_WINDOW_AUTOSIZE);imshow("input",src);namedWindow("output1",CV_WINDOW_AUTOSIZE);imshow("output1",dst1);namedWindow("output2",CV_WINDOW_AUTOSIZE);imshow("output2",dst2);namedWindow("output3",CV_WINDOW_AUTOSIZE);imshow("output3",dst3);namedWindow("output4",CV_WINDOW_AUTOSIZE);imshow("output4",dst4);namedWindow("output5",CV_WINDOW_AUTOSIZE);imshow("output5",dst5);namedWindow("output6",CV_WINDOW_AUTOSIZE);imshow("output6",dst6);waitKey(0);return 0;
}
运行截图:
Mat对象常用方法
函数 | 功能 |
---|---|
row | 行数 |
col | 列数 |
rowRange | 为指定的行span创建一个新的矩阵头,可去指定行区间元素 |
colRange | 为指定的列span创建一个新的矩阵头,可去指定列区间元素 |
Mat clone() | 创建一个数组及其基础数据的完整副本 |
void copyTo(Mat mat) | 完全复制一份 |
void convertTo(Mat dst, int type) | 转换,比如8位的转换为float |
int channels() | 通道数 |
int depth() | 深度 |
bool empty(); | 是否空,如果数组没有elements,则返回true |
uchar* ptr(i=0) | 矩阵数据指针 |
Mat::zeros | 返回指定大小和类型的0数组 |
Mat::ones | 返回一个指定的大小和类型全为1的数组 |
Mat::at | 返回对指定数组元素的引用 |
#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
using namespace std;
using namespace cv;int main(int argc,char** argv){Mat src;src=imread("E:/Experiment/OpenCV/Pictures/dog2.jpg");if(src.empty()){cout<<"Could not laod image ..."<<endl;return -1;}//图片的复制操作Mat dst1=src.clone();//完全拷贝Mat dst2; src.copyTo(dst2);//完全拷贝Mat dst3(src);//只是复制部分,Mat对象头部与数据的指针,不会复制数据namedWindow("input",CV_WINDOW_AUTOSIZE);imshow("input",src);namedWindow("output1",CV_WINDOW_AUTOSIZE);imshow("output1",dst1);namedWindow("output2",CV_WINDOW_AUTOSIZE);imshow("output2",dst2);namedWindow("output3",CV_WINDOW_AUTOSIZE);imshow("output3",dst3);//其他函数测试Mat dst4;//测试channels()、ptr()、cols()、rows();cvtColor(src, dst4, CV_BGR2GRAY);//dst4对象输出图像的内存是自动分配的printf("rgb.channels=%d, gray.channels=%d,src.type=%d,dst4.type=%d\n", src.channels(), dst4.channels(), src.type(), dst4.type());//rgb通道数为3,gray通道数为1,16,0const uchar* firstRow = dst4.ptr<uchar>(0);//图像第一行颜色数据printf("first pixel value : %d\n", *firstRow);printf("dst.cols=%d, dst.rows=%d\n\n", dst4.cols, dst4.rows);// CV_8UC1 8表示8位,UC表示unsigned char,1表示1个通道, Scalar表示向量长度,要与通道数目一致Mat dst5(3, 3, CV_8UC3, Scalar(0, 0, 255));//3*3个像素点,CV_8UC3表示像素点为三个通道颜色数据,CV_8UC1表示像素点为单通道,对应的传 Scalar(255) cout << "dst5 = " << endl << dst5 << endl<<endl;//打印每个通道颜色数据/* m =[ 0, 0, 255, 0, 0, 255, 0, 0, 255;0, 0, 255, 0, 0, 255, 0, 0, 255;0, 0, 255, 0, 0, 255, 0, 0, 255 ]*/imshow("scalar", dst5);Mat dst6;dst6.create(src.size(), src.type());//以create方式创建Matdst6 = Scalar(0, 0, 255);//Scalar参数顺序是 B G Rimshow("create", dst6);//Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0); //定义小数组,以 << 运算符重载 创建MatMat zeros = Mat::zeros(2, 2, CV_8UC1);//初始值0cout << "zeros = " << endl << zeros << endl<<endl;/*zeros =[0, 0;0, 0]eye =[1, 0;0, 1;0, 0]*/Mat eye = Mat::eye(3, 2, CV_8UC1);//沿着主对角线的像素点(不是通道)的第一个通道的数据设置为1,其他都为0,对于CV_8UC1的方阵可以生成单一矩阵cout << "eye = " << endl << eye << endl;waitKey(0);return 0;
}
运行截图:
- 部分复制:一般情况下只会复制Mat对象的头和指针部分,不会复制数据部分
Mat A= imread(imgFilePath);
Mat B(A) // 只复制
- 完全复制:如果想把Mat对象的头部和数据部分一起复制,可以通过如下两个API实现
Mat F = A.clone();
或Mat G; A.copyTo(G);
- Mat对象使用-四个要点:
- 输出图像的内存是自动分配的
- 使用OpenCV的C++接口,不需要考虑内存分配问题
- 赋值操作和拷贝构造函数只会复制头部分
- 使用clone与copyTo两个函数实现数据完全复制
Mat定义数组
cv::Mat构造函数
Mat M(2,2,CV_8UC3, Scalar(0,0,255))
其中前两个参数分别表示行(row)跟列(column)、第三个CV_8UC3中的8表示每个通道占8位、U表示无符号、C表示Char类型、3表示通道数目是3,第四个参数是向量表示初始化每个像素值是多少,向量长度对应通道数目一致创建多维数组cv::Mat::create
int sz[3] = {2,2,2};
Mat L(3,sz, CV_8UC1, Scalar::all(0));
cv::Mat::create实现
Mat M;
M.create(4, 3, CV_8UC2);
M = Scalar(127,127);
cout << “M = " << endl << " " << M << endl << endl;
uchar* firstRow = M.ptr(0);
printf(”%d", *firstRow);
- 定义小数组
Mat C = (Mat_(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
cout << "C = " << endl << " " << C << endl << endl;
程序代码见上
OpenCV-图像处理(03、Mat对象)相关推荐
- Opencv显示创建Mat对象的七种方式
方式一: [cpp] view plain copy #include<iostream> #include<opencv2/opencv.hpp> using namespa ...
- OpenCV【零】—————cv::Mat——Mat对象创建方法
OpenCV (一)--Mat对象创建方法 目录 OpenCV (一)--Mat对象创建方法 1. cv::Mat优点及原理(本质类) 2. Mat类拷贝及对象的创建方法 3. Mat 对象元素的高效 ...
- OpenCV 3.1.0中的Mat对象使用
一: Mat介绍 OpenCV刚出来的时候图像加载内存之后的对象是IplImage作为数据对象,里面存储了图像的像素数据和宽.高.位图深度.图像大小.通道数等基本属性.IplImage结构是C语言体系 ...
- opencv QImage与Mat 互转 及简单的图像处理
opencv(mat与qimage 的互转)及简单的图像处理 一.opencv库文件 二.使用方式(Qt) 三.QImage 转 Mat (不太全,多多指教) 四.Mat转 QImage 五.一些简单 ...
- Java OpenCV 图像处理30 视频分析和对象跟踪 视频读取
Java OpenCV 图像处理30 视频分析和对象跟踪 视频读取 Java OpenCV-4.0.0 图像处理 视频分析和对象跟踪 视频读取 package com.xu.opencv.video; ...
- Java OpenCV 图像处理32.4 视频分析和对象跟踪 切换背景
Java OpenCV 图像处理32.4 视频分析和对象跟踪 切换背景 方法 含义 解释 bitwise_and "与"操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制 ...
- OpenCV 笔记(06)— Mat 结构、像素值存储方法、创建 Mat 对象各种方法、Mat 对象的运算
数字图像中的每个点都称为像素(对于图像元素),并且每个像素可以存储一个或多个值,这取决于它是否是仅存储一个值的黑白图像(也称为二进制图像,比如只存储0或1),还是存储两个值的灰度图像,或者是存储三个值 ...
- 创建mat二值图 matlab,OpenCV学习之路(二)——Mat对象
早期的 OpenCV 中,使用 IplImage 和 CvMat 数据结构来表示图像.IplImage和 CvMat 都是 C 语言的结构.使用这两个结构的问题是内存需要手动管理,开发者必须清楚的知道 ...
- 【opencv4】opencv教程 C++ 4、Mat对象(深拷贝:clone()、copyTo(),create()创建图片,zeros()、eye()初始化空白图像,Scalar()创建向量)
上一讲:[opencv4]opencv视频教程 C++(opencv教程)3.矩阵的掩膜操作(filter2D) 下一讲:[opencv4]opencv视频教程 C++ 5.读写图像imread.im ...
- 【OpenCV入门学习笔记2】:Mat对象
b站:https://www.bilibili.com/video/BV1uW411d7Wf?p=5 我在b站的学习笔记和实验代码的整理如下: 示例代码: Matdemo //------------ ...
最新文章
- python创建列向量_关于Numpy中的行向量和列向量详解
- [日常工作]偷懒创建一个存储过程进行模拟工作.
- 一个高(3D/2D)动态表现的酷站
- python实现后台系统的JWT认证
- [Luogu] P4198 楼房重建
- 程序员面试题精选100题(05)-查找最小的k个元素[算法]
- rstudio python_如虎添翼:用Python与C++扩展R语言的应用场景
- 使用ASP.Net WebAPI构建REST服务(四)——参数绑定
- 前牙正常覆盖是多少_深覆合和深覆盖两者怎么区分?花两分钟进来了解一下
- dom元素滚动条高度 js_javascript 设置元素滚动大小
- 设计模式之——抽象工厂模式
- solr的简单使用说明
- Hyperion神器之SmartView产品(中篇)
- Python中国象棋源代码及素材
- 戴尔服务器怎么u盘安装win7系统教程,戴尔电脑怎么用u盘装win7系统教程
- 视频转MP3音频格式在线工具
- Html页面Js调用android本地相机和图片
- 悲伤的时候总会想起什么
- 【整理归纳】Linux中文件的Access,Modify,Change区别
- 2021年全球及中国三元前驱体行业现状及竞争格局分析,基于海外新能源汽车发展,我国是最大出口国「图」
热门文章
- iOS 程序打包,安装流程
- 《中国人工智能学会通讯》——11.24 本文的出发点:模仿人类视觉
- OraclePLSQL 安装及乱码问题解决
- elastix中NAT穿越问题解决办法
- UITextFiled 简介
- 华硕获奖方案-构建海量数据处理性能的医院集群系统
- 黑色的php编辑器,五款常用的免费php编辑器推荐
- vmware+player+12+linux,Vmware player 12
- springsecurity登出的配置信息以及登出的认证效果
- ajax通过对象获得时间戳,从FullCalendar事件对象获取简单的时间戳