OpenCV Mat实例详解 一

          OpenCV中的Mat是一个类,它用存储图像信息。由两部分数据组成:矩阵头和像素值矩阵。矩阵头包含矩阵尺寸、存储方法、存储地址等信息,而像素值矩阵则存储实际的像素值数据。

        Mat类在OpenCV中有十分重要的作用,图像信息的载入、保存、传递都离不开Mat类。OpenCV用来保存图像矩阵类型的数据信息,包括向量、矩阵、灰度或彩色图像等数据。通过使用Mat类,可以对图像进行各种操作和变换,例如裁剪、旋转、缩放、滤波等。 下面详细介绍Mat类中的常用方法(函数)。

Mat 类的常用构造函数

        Mat类的构造函数原型有很多,下面介绍几个常用的构造函数及其用法。

        Mat (int rows, int cols, int type);

        rows图像的像素行数,也可以说是以像素为单位的高度。

         cols图像的像素列数,也可以说是以像素为单位的宽度。

        type 数据类型,OpenCV的数据类型定义在interface.h中。如下:

 
#define 	CV_8U   0#define 	CV_8S   1#define 	CV_16U   2#define 	CV_16S   3#define 	CV_32S   4#define 	CV_32F   5#define 	CV_64F   6#define 	CV_16F   7#define 	CV_MAKE_TYPE   CV_MAKETYPE#define 	CV_8UC1   CV_MAKETYPE(CV_8U,1)#define 	CV_8UC2   CV_MAKETYPE(CV_8U,2)#define 	CV_8UC3   CV_MAKETYPE(CV_8U,3)#define 	CV_8UC4   CV_MAKETYPE(CV_8U,4)#define 	CV_8UC(n)   CV_MAKETYPE(CV_8U,(n))#define 	CV_8SC1   CV_MAKETYPE(CV_8S,1)#define 	CV_8SC2   CV_MAKETYPE(CV_8S,2)#define 	CV_8SC3   CV_MAKETYPE(CV_8S,3)#define 	CV_8SC4   CV_MAKETYPE(CV_8S,4)#define 	CV_8SC(n)   CV_MAKETYPE(CV_8S,(n))#define 	CV_16UC1   CV_MAKETYPE(CV_16U,1)#define 	CV_16UC2   CV_MAKETYPE(CV_16U,2)#define 	CV_16UC3   CV_MAKETYPE(CV_16U,3)#define 	CV_16UC4   CV_MAKETYPE(CV_16U,4)#define 	CV_16UC(n)   CV_MAKETYPE(CV_16U,(n))#define 	CV_16SC1   CV_MAKETYPE(CV_16S,1)#define 	CV_16SC2   CV_MAKETYPE(CV_16S,2)#define 	CV_16SC3   CV_MAKETYPE(CV_16S,3)#define 	CV_16SC4   CV_MAKETYPE(CV_16S,4)#define 	CV_16SC(n)   CV_MAKETYPE(CV_16S,(n))#define 	CV_32SC1   CV_MAKETYPE(CV_32S,1)#define 	CV_32SC2   CV_MAKETYPE(CV_32S,2)#define 	CV_32SC3   CV_MAKETYPE(CV_32S,3)#define 	CV_32SC4   CV_MAKETYPE(CV_32S,4)#define 	CV_32SC(n)   CV_MAKETYPE(CV_32S,(n))#define 	CV_32FC1   CV_MAKETYPE(CV_32F,1)#define 	CV_32FC2   CV_MAKETYPE(CV_32F,2)#define 	CV_32FC3   CV_MAKETYPE(CV_32F,3)#define 	CV_32FC4   CV_MAKETYPE(CV_32F,4)#define 	CV_32FC(n)   CV_MAKETYPE(CV_32F,(n))#define 	CV_64FC1   CV_MAKETYPE(CV_64F,1)#define 	CV_64FC2   CV_MAKETYPE(CV_64F,2)#define 	CV_64FC3   CV_MAKETYPE(CV_64F,3)#define 	CV_64FC4   CV_MAKETYPE(CV_64F,4)#define 	CV_64FC(n)   CV_MAKETYPE(CV_64F,(n))#define 	CV_16FC1   CV_MAKETYPE(CV_16F,1)#define 	CV_16FC2   CV_MAKETYPE(CV_16F,2)#define 	CV_16FC3   CV_MAKETYPE(CV_16F,3)#define 	CV_16FC4   CV_MAKETYPE(CV_16F,4)#define 	CV_16FC(n)   CV_MAKETYPE(CV_16F,(n))

下面以实例演示其用法

        在VS 中新建一个C++ 控制台程序,完成代码如下:

// OpenCVMatTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{Mat tmp(100,200, CV_8U);cout <<"构造Mat对象的高度为: " << tmp.rows << endl;cout << "构造Mat对象的宽度为: " << tmp.cols << endl;cout << "构造Mat对象的数据类型为: " << tmp.type() << endl;
}

试运行结果如下:

说明已成功构造对象。将构造函数的type直接输入0,也是同样的结果。如下:

 Mat tmp(100, 200,0);

如果将type参数用CV_8UC1替代结果又如何,如下:

// OpenCVMatTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{//Mat tmp(100,200, CV_8U);Mat tmp(100, 200, CV_8UC1);cout <<"构造Mat对象的高度为: " << tmp.rows << endl;cout << "构造Mat对象的宽度为: " << tmp.cols << endl;cout << "构造Mat对象的数据类型为: " << tmp.type() << endl;
}

试运行的结果,如下:

结果并未发生改变。修改代码如下:

// OpenCVMatTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{//Mat tmp(100,200, CV_8U);Mat tmp(100, 200, CV_8UC1);cout <<"构造Mat对象的高度为: " << tmp.rows << endl;cout << "构造Mat对象的宽度为: " << tmp.cols << endl;cout << "构造Mat对象的通道数为: " << tmp.channels() << endl;cout << "构造Mat对象的位深度为: " << tmp.depth() << endl;cout << "构造Mat对象的数据类型为: " << tmp.type() << endl;
}

、试运行的结果如下:

再次修改代码如下:

// OpenCVMatTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{//Mat tmp(100,200, CV_8U);Mat tmp(100, 200, CV_8UC2);cout <<"构造Mat对象的高度为: " << tmp.rows << endl;cout << "构造Mat对象的宽度为: " << tmp.cols << endl;cout << "构造Mat对象的通道数为: " << tmp.channels() << endl;cout << "构造Mat对象的位深度为: " << tmp.depth() << endl;cout << "构造Mat对象的数据类型为: " << tmp.type() << endl;
}

试运行结果如下:

可以看出数据类型与通道数发生了改变,位深度是0,即8位。再修改代码改成如下:

// OpenCVMatTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{//Mat tmp(100,200, CV_8U);//Mat tmp(100, 200, CV_8UC2);Mat tmp(100, 200, CV_8SC3);cout <<"构造Mat对象的高度为: " << tmp.rows << endl;cout << "构造Mat对象的宽度为: " << tmp.cols << endl;cout << "构造Mat对象的通道数为: " << tmp.channels() << endl;cout << "构造Mat对象的位深度为: " << tmp.depth() << endl;cout << "构造Mat对象的数据类型为: " << tmp.type() << endl;
}

试运行结果如下:

 说明type参数与位深度与通道数相关。从数据类型定义即可看出,如CV_8UC1其中的8U表示位深度为0,即8位无符号数据,C1表示通道数为1。

        Mat (Size size, int type);

这个构造函数与上面构造函数,只不过用Size参数代替了rows、cols参数。下面演示其使用。将上面的示例代码修改如下:

// OpenCVMatTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{//Mat tmp(100,200, CV_8U);//Mat tmp(100, 200, CV_8UC2);//Mat tmp(100, 200, CV_8SC3);Mat tmp(Size(100, 200), CV_16UC3);cout <<"构造Mat对象的高度为: " << tmp.rows << endl;cout << "构造Mat对象的宽度为: " << tmp.cols << endl;cout << "构造Mat对象的通道数为: " << tmp.channels() << endl;cout << "构造Mat对象的位深度为: " << tmp.depth() << endl;cout << "构造Mat对象的数据类型为: " << tmp.type() << endl;
}

试运行,结果如下:

可以看出Size的第一个参数是cols,第二个参数是rows,这点需要注意。

MatMat (int rows, int cols, int type, const Scalar &s)

 修改上面示例程序代码来演示该构造函数的使用,代码修改如下:

// OpenCVMatTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{//Mat tmp(100,200, CV_8U);//Mat tmp(100, 200, CV_8UC2);//Mat tmp(100, 200, CV_8SC3);Mat tmp = Mat(Size(400, 200), CV_8UC3, Scalar(255,0,0));cout <<"构造Mat对象的高度为: " << tmp.rows << endl;cout << "构造Mat对象的宽度为: " << tmp.cols << endl;cout << "构造Mat对象的通道数为: " << tmp.channels() << endl;cout << "构造Mat对象的位深度为: " << tmp.depth() << endl;cout << "构造Mat对象的数据类型为: " << tmp.type() << endl;cout << "构造Mat对象的Size为: " << tmp.size() << endl;imshow("构造图像", tmp);waitKey(0);

试运行,结果如下:

可以看出,已经构造出蓝色图片的Mat对象。

Mat (Size size, int type, const Scalar &s)

这个构造函数与上面的构造函数类似,就不再做详细介绍。

Mat (int ndims, const int *sizes, int type)

ndims 维数,只有1,2有效。

size 包含rows,cols的数组名

修改上面示例代码,来演示该构造函数的用法,修改后的代码如下:

// OpenCVMatTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{//Mat tmp(100,200, CV_8U);//Mat tmp(100, 200, CV_8UC2);//Mat tmp(100, 200, CV_8SC3);//Mat tmp = Mat(Size(400, 200), CV_8UC3, Scalar(255,0,0));int size[] = {400,200};Mat tmp = Mat(2, size, CV_8UC3, Scalar(0,255,0));cout <<"构造Mat对象的高度为: " << tmp.rows << endl;cout << "构造Mat对象的宽度为: " << tmp.cols << endl;cout << "构造Mat对象的通道数为: " << tmp.channels() << endl;cout << "构造Mat对象的位深度为: " << tmp.depth() << endl;cout << "构造Mat对象的数据类型为: " << tmp.type() << endl;cout << "构造Mat对象的Size为: " << tmp.size() << endl;imshow("构造图像", tmp);waitKey(0);
}

试运行后,结果如下:

 可以看出,数组的第一个元素被作为rows,第二个元素作为cols。把ndims参数值设为1,运行结果如下:

可以看出,构造对象图片的列变成了1,rows依然使用的数组的第一个元素。

Mat (const std::vector< int > &sizes, int type);

Mat (int ndims, const int *sizes, int type, const Scalar &s)

size 装有图像维度数据的vector 对象,

type 数据类型

s 含义颜色信息的Scalar参数

修改上面例程中的代码,来演示该构造函数的用法,修改后的代码如下:

// OpenCVMatTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{//Mat tmp(100,200, CV_8U);//Mat tmp(100, 200, CV_8UC2);//Mat tmp(100, 200, CV_8SC3);//Mat tmp = Mat(Size(400, 200), CV_8UC3, Scalar(255,0,0));//int size[] = {400,200};// Mat tmp = Mat(2, size, CV_8UC3, Scalar(0,255,0));//Mat tmp = Mat(1, size, CV_8UC3, Scalar(0, 255, 0));vector<int> size(2);size[0] = 400;size[1] = 200;Mat tmp = Mat(size, CV_8UC3, Scalar(0, 255, 0));cout <<"构造Mat对象的高度为: " << tmp.rows << endl;cout << "构造Mat对象的宽度为: " << tmp.cols << endl;cout << "构造Mat对象的通道数为: " << tmp.channels() << endl;cout << "构造Mat对象的位深度为: " << tmp.depth() << endl;cout << "构造Mat对象的数据类型为: " << tmp.type() << endl;cout << "构造Mat对象的Size为: " << tmp.size() << endl;imshow("构造图像", tmp);waitKey(0);
}

试运行,结果如下:

 可以看出已成功构造对象,且vector对象的第一个元素作为rows,第二个元素作为cols。

Mat (const Mat &m)

以已有的Mat对象,构造新的·Mat对象。m: Mat源

修改上面代码,来演示该构造函数的使用方法,修改后的代码如下:

// OpenCVMatTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{//Mat tmp(100,200, CV_8U);//Mat tmp(100, 200, CV_8UC2);//Mat tmp(100, 200, CV_8SC3);//Mat tmp = Mat(Size(400, 200), CV_8UC3, Scalar(255,0,0));//int size[] = {400,200};// Mat tmp = Mat(2, size, CV_8UC3, Scalar(0,255,0));//Mat tmp = Mat(1, size, CV_8UC3, Scalar(0, 255, 0));//vector<int> size(2);//size[0] = 400;//size[1] = 200;//Mat tmp = Mat(size, CV_8UC3, Scalar(0, 255, 0));Mat src = imread("1.jpg");src.resize(src.rows / 2, src.cols / 2);Mat tmp = Mat(src);cout <<"构造Mat对象的高度为: " << tmp.rows << endl;cout << "构造Mat对象的宽度为: " << tmp.cols << endl;cout << "构造Mat对象的通道数为: " << tmp.channels() << endl;cout << "构造Mat对象的位深度为: " << tmp.depth() << endl;cout << "构造Mat对象的数据类型为: " << tmp.type() << endl;cout << "构造Mat对象的Size为: " << tmp.size() << endl;cout << "构造Mat对象的Step为: " << tmp.step << endl;imshow("构造图像", tmp);waitKey(0);
}

试运行,结果如下:

Mat (int rows, int cols, int type, void *data, size_t step=AUTO_STEP);

Mat (Size size, int type, void *data, size_t step=AUTO_STEP);

Mat (int ndims, const int *sizes, int type, void *data, const size_t *steps=0);

Mat (const std::vector< int > &sizes, int type, void *data, const size_t *steps=0);

rows 构造对象图像rows

cols 构造对象图像 cols

type 构造对象图像数据类型

data 构造对象图像数据指针

ndims 构造对象图像的维度数

size 包含构造对象rows,cols参数的数组名

step 每个行矩阵所占的字节数。

steps 指向step的指针。

修改上面示例代码,来演示以上构造函数的用法,修改后的代码如下:

// OpenCVMatTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{//Mat tmp(100,200, CV_8U);//Mat tmp(100, 200, CV_8UC2);//Mat tmp(100, 200, CV_8SC3);//Mat tmp = Mat(Size(400, 200), CV_8UC3, Scalar(255,0,0));//int size[] = {400,200};// Mat tmp = Mat(2, size, CV_8UC3, Scalar(0,255,0));//Mat tmp = Mat(1, size, CV_8UC3, Scalar(0, 255, 0));//vector<int> size(2);//size[0] = 400;//size[1] = 200;//Mat tmp = Mat(size, CV_8UC3, Scalar(0, 255, 0));Mat src = imread("1.jpg");src.resize(src.rows / 2, src.cols / 2);//Mat tmp = Mat(src);Mat tmp = Mat(src.rows, src.cols, src.type(),src.data);cout <<"构造Mat对象的高度为: " << tmp.rows << endl;cout << "构造Mat对象的宽度为: " << tmp.cols << endl;cout << "构造Mat对象的通道数为: " << tmp.channels() << endl;cout << "构造Mat对象的位深度为: " << tmp.depth() << endl;cout << "构造Mat对象的数据类型为: " << tmp.type() << endl;cout << "构造Mat对象的Size为: " << tmp.size() << endl;cout << "构造Mat对象的Step为: " << tmp.step << endl;imshow("构造图像", tmp);waitKey(0);
}

试运行,结果如下:

修改上面示例代码,来演示另外构造函数的使用,修改后的代码如下:

// OpenCVMatTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{//Mat tmp(100,200, CV_8U);//Mat tmp(100, 200, CV_8UC2);//Mat tmp(100, 200, CV_8SC3);//Mat tmp = Mat(Size(400, 200), CV_8UC3, Scalar(255,0,0));//int size[] = {400,200};// Mat tmp = Mat(2, size, CV_8UC3, Scalar(0,255,0));//Mat tmp = Mat(1, size, CV_8UC3, Scalar(0, 255, 0));//vector<int> size(2);//size[0] = 400;//size[1] = 200;//Mat tmp = Mat(size, CV_8UC3, Scalar(0, 255, 0));Mat src = imread("1.jpg");src.resize(src.rows / 2, src.cols / 2);//Mat tmp = Mat(src);//Mat tmp = Mat(src.rows, src.cols, src.type(),src.data);Mat tmp = Mat(src.size(), src.type(), src.data);cout <<"构造Mat对象的高度为: " << tmp.rows << endl;cout << "构造Mat对象的宽度为: " << tmp.cols << endl;cout << "构造Mat对象的通道数为: " << tmp.channels() << endl;cout << "构造Mat对象的位深度为: " << tmp.depth() << endl;cout << "构造Mat对象的数据类型为: " << tmp.type() << endl;cout << "构造Mat对象的Size为: " << tmp.size() << endl;cout << "构造Mat对象的Step为: " << tmp.step << endl;imshow("构造图像", tmp);waitKey(0);
}

试运行,结果如下:

修改上面示例代码,来演示另外构造函数的使用,修改后的代码如下:

// OpenCVMatTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{//Mat tmp(100,200, CV_8U);//Mat tmp(100, 200, CV_8UC2);//Mat tmp(100, 200, CV_8SC3);//Mat tmp = Mat(Size(400, 200), CV_8UC3, Scalar(255,0,0));//int size[] = {400,200};// Mat tmp = Mat(2, size, CV_8UC3, Scalar(0,255,0));//Mat tmp = Mat(1, size, CV_8UC3, Scalar(0, 255, 0));//vector<int> size(2);//size[0] = 400;//size[1] = 200;//Mat tmp = Mat(size, CV_8UC3, Scalar(0, 255, 0));Mat src = imread("1.jpg");src.resize(src.rows / 2, src.cols / 2);//Mat tmp = Mat(src);//Mat tmp = Mat(src.rows, src.cols, src.type(),src.data);//Mat tmp = Mat(src.size(), src.type(), src.data);Mat tmp = Mat(700,800, CV_8UC3, src.data+800*3);cout <<"构造Mat对象的高度为: " << tmp.rows << endl;cout << "构造Mat对象的宽度为: " << tmp.cols << endl;cout << "构造Mat对象的通道数为: " << tmp.channels() << endl;cout << "构造Mat对象的位深度为: " << tmp.depth() << endl;cout << "构造Mat对象的数据类型为: " << tmp.type() << endl;cout << "构造Mat对象的Size为: " << tmp.size() << endl;cout << "构造Mat对象的Step为: " << tmp.step << endl;imshow("构造图像", tmp);waitKey(0);
}

试运行,结果如下: 

Mat (const Mat &m, const Range &rowRange, const Range &colRange=Range::all());

Mat (const Mat &m, const Rect &roi);

Mat (const Mat &m, const Range *ranges);

Mat (const Mat &m, const std::vector< Range > &ranges);

m 分配给构建对象的Mat对象

rowRange 行范围

colRange 列范围

roi 感兴趣的矩形区域

ranges Range数组或Range的vector 容器

用此构造函数构建的Mat对象不会拷贝数据,修改新构建对象的数据反而来修改新构建Mat对象的数据会修改已有Mat对象m的数据,实质上已有图像构建感兴趣区域对象。

修改上面示例代码,来演示构造函数的使用,修改后的代码如下:

// OpenCVMatTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{//Mat tmp(100,200, CV_8U);//Mat tmp(100, 200, CV_8UC2);//Mat tmp(100, 200, CV_8SC3);//Mat tmp = Mat(Size(400, 200), CV_8UC3, Scalar(255,0,0));//int size[] = {400,200};// Mat tmp = Mat(2, size, CV_8UC3, Scalar(0,255,0));//Mat tmp = Mat(1, size, CV_8UC3, Scalar(0, 255, 0));//vector<int> size(2);//size[0] = 400;//size[1] = 200;//Mat tmp = Mat(size, CV_8UC3, Scalar(0, 255, 0));Mat src = imread("1.jpg");src.resize(src.rows / 2, src.cols / 2);//Mat tmp = Mat(src);//Mat tmp = Mat(src.rows, src.cols, src.type(),src.data);//Mat tmp = Mat(src.size(), src.type(), src.data);//Mat tmp = Mat(700,800, CV_8UC3, src.data+800*3);Range rowRange = Range(0, 700);Range colRange = Range(0, 700);Mat tmp = Mat(src, rowRange, colRange);cout <<"构造Mat对象的高度为: " << tmp.rows << endl;cout << "构造Mat对象的宽度为: " << tmp.cols << endl;cout << "构造Mat对象的通道数为: " << tmp.channels() << endl;cout << "构造Mat对象的位深度为: " << tmp.depth() << endl;cout << "构造Mat对象的数据类型为: " << tmp.type() << endl;cout << "构造Mat对象的Size为: " << tmp.size() << endl;cout << "构造Mat对象的Step为: " << tmp.step << endl;imshow("构造图像", tmp);waitKey(0);
}

试运行,结果如下:

 修改上面示例代码,来演示构造函数的使用,修改后的代码如下:

#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{//Mat tmp(100,200, CV_8U);//Mat tmp(100, 200, CV_8UC2);//Mat tmp(100, 200, CV_8SC3);//Mat tmp = Mat(Size(400, 200), CV_8UC3, Scalar(255,0,0));//int size[] = {400,200};// Mat tmp = Mat(2, size, CV_8UC3, Scalar(0,255,0));//Mat tmp = Mat(1, size, CV_8UC3, Scalar(0, 255, 0));//vector<int> size(2);//size[0] = 400;//size[1] = 200;//Mat tmp = Mat(size, CV_8UC3, Scalar(0, 255, 0));Mat src = imread("1.jpg");src.resize(src.rows / 2, src.cols / 2);//Mat tmp = Mat(src);//Mat tmp = Mat(src.rows, src.cols, src.type(),src.data);//Mat tmp = Mat(src.size(), src.type(), src.data);//Mat tmp = Mat(700,800, CV_8UC3, src.data+800*3);//Range rowRange = Range(0, 700);//Range colRange = Range(0, 700);//Mat tmp = Mat(src, rowRange, colRange);Rect rec = Rect(100, 0, 700, 700);Mat tmp = Mat(src, rec);cout <<"构造Mat对象的高度为: " << tmp.rows << endl;cout << "构造Mat对象的宽度为: " << tmp.cols << endl;cout << "构造Mat对象的通道数为: " << tmp.channels() << endl;cout << "构造Mat对象的位深度为: " << tmp.depth() << endl;cout << "构造Mat对象的数据类型为: " << tmp.type() << endl;cout << "构造Mat对象的Size为: " << tmp.size() << endl;cout << "构造Mat对象的Step为: " << tmp.step << endl;imshow("构造图像", tmp);waitKey(0);
}

试运行,结果如下:

 修改上面代码,来演示另一构造函数的使用,修改后的代码如下:

#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{//Mat tmp(100,200, CV_8U);//Mat tmp(100, 200, CV_8UC2);//Mat tmp(100, 200, CV_8SC3);//Mat tmp = Mat(Size(400, 200), CV_8UC3, Scalar(255,0,0));//int size[] = {400,200};// Mat tmp = Mat(2, size, CV_8UC3, Scalar(0,255,0));//Mat tmp = Mat(1, size, CV_8UC3, Scalar(0, 255, 0));//vector<int> size(2);//size[0] = 400;//size[1] = 200;//Mat tmp = Mat(size, CV_8UC3, Scalar(0, 255, 0));Mat src = imread("1.jpg");src.resize(src.rows / 2, src.cols / 2);//Mat tmp = Mat(src);//Mat tmp = Mat(src.rows, src.cols, src.type(),src.data);//Mat tmp = Mat(src.size(), src.type(), src.data);//Mat tmp = Mat(700,800, CV_8UC3, src.data+800*3);//Range rowRange = Range(0, 700);//Range colRange = Range(0, 700);//Mat tmp = Mat(src, rowRange, colRange);//Rect rec = Rect(100, 0, 700, 700);//Mat tmp = Mat(src, rec);Range rowRange = Range(0, 700);Range colRange = Range(100, 700);Range ranges[] = {rowRange, colRange};Mat tmp = Mat(src, ranges);cout <<"构造Mat对象的高度为: " << tmp.rows << endl;cout << "构造Mat对象的宽度为: " << tmp.cols << endl;cout << "构造Mat对象的通道数为: " << tmp.channels() << endl;cout << "构造Mat对象的位深度为: " << tmp.depth() << endl;cout << "构造Mat对象的数据类型为: " << tmp.type() << endl;cout << "构造Mat对象的Size为: " << tmp.size() << endl;cout << "构造Mat对象的Step为: " << tmp.step << endl;imshow("构造图像", tmp);waitKey(0);
}

试运行,结果如下:

 修改上面代码,来演示另一构造函数的使用,修改后的代码如下:

// OpenCVMatTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{//Mat tmp(100,200, CV_8U);//Mat tmp(100, 200, CV_8UC2);//Mat tmp(100, 200, CV_8SC3);//Mat tmp = Mat(Size(400, 200), CV_8UC3, Scalar(255,0,0));//int size[] = {400,200};// Mat tmp = Mat(2, size, CV_8UC3, Scalar(0,255,0));//Mat tmp = Mat(1, size, CV_8UC3, Scalar(0, 255, 0));//vector<int> size(2);//size[0] = 400;//size[1] = 200;//Mat tmp = Mat(size, CV_8UC3, Scalar(0, 255, 0));Mat src = imread("1.jpg");src.resize(src.rows / 2, src.cols / 2);//Mat tmp = Mat(src);//Mat tmp = Mat(src.rows, src.cols, src.type(),src.data);//Mat tmp = Mat(src.size(), src.type(), src.data);//Mat tmp = Mat(700,800, CV_8UC3, src.data+800*3);//Range rowRange = Range(0, 700);//Range colRange = Range(0, 700);//Mat tmp = Mat(src, rowRange, colRange);//Rect rec = Rect(100, 0, 700, 700);//Mat tmp = Mat(src, rec);Range rowRange = Range(0, 700);Range colRange = Range(100, 700);//Range ranges[] = {rowRange, colRange};//Mat tmp = Mat(src, ranges);vector<Range> ranges1(2);ranges1[0] = rowRange;ranges1[1] = colRange;Mat tmp = Mat(src, ranges1);cout <<"构造Mat对象的高度为: " << tmp.rows << endl;cout << "构造Mat对象的宽度为: " << tmp.cols << endl;cout << "构造Mat对象的通道数为: " << tmp.channels() << endl;cout << "构造Mat对象的位深度为: " << tmp.depth() << endl;cout << "构造Mat对象的数据类型为: " << tmp.type() << endl;cout << "构造Mat对象的Size为: " << tmp.size() << endl;cout << "构造Mat对象的Step为: " << tmp.step << endl;imshow("构造图像", tmp);waitKey(0);
}

由于篇幅关系,OpenCV构造函数暂时介绍在这里,将在下篇博文中继续介绍OpenCV Mat类。

        本篇 博文示例是基于OpenCV(opencv目录位于d盘根目录下)及VS2022。示例源码已上传到CSDN,其链接为:https://download.csdn.net/download/billliu66/88831683

   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/469509.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hive的相关概念——架构、数据存储、读写文件机制

目录 一、架构及组件介绍 1.1 Hive整体架构 1.2 Hive组件 1.3 Hive数据模型&#xff08;Data Model&#xff09; 1.3.1 Databases 1.3.2 Tables 1.3.3 Partitions 1.3.4 Buckets 二、Hive读写文件机制 2.1 SerDe 作用 2.2 Hive读写文件流程 2.2.1 读取文件的过程 …

Python算法探索:从经典到现代(三)

一、引言 随着信息技术的飞速发展&#xff0c;数据已经成为现代社会不可或缺的资源。Python&#xff0c;作为数据处理和分析的利器&#xff0c;为我们提供了大量强大的库和工具&#xff0c;用于从经典到现代的各种算法探索。本文将带你领略Python在算法领域的魅力&#xff0c;从…

儿童护眼台灯哪个值得推荐?推荐专业的儿童护眼台灯

现在的孩子很多都存在视力问题&#xff0c;而且年龄也越来越早&#xff0c;不少还为上学的孩子都早已戴上小眼镜。虽说这可能存在家族近视遗传的可能性&#xff0c;不过更多的还是后天导致的。长时间玩耍电子产品、缺乏运动、不良用眼习惯、不合适的光线等等都是导致孩子近视的…

数仓建模—数据网格

数据网格 随着数字化时代的到来,近几年数据领域的新技术概念不断涌现,无论是数据湖、湖仓一体、流批一体、存算一体、数据编织抑或数据网格,很多还爬上了Gartner曲线,其中数据网格备受关注,数据网格从字面意思来看挺抽象的,会劝退很多人,但当你深入去理解这个概念时,才…

2.15 字符串练习

1、选择题 1.1、有以下程序 int main() { char a[7]"a0\0a0\0";int i,j; isizeof(a); jstrlen(a); printf("%d %d\n",i,j); } //strlen求出字符串的长度&#xff0c;其实是字符串中字符的个数&#xff0c;不包括\0 程序运行后的输出结果是 C…

thinkphp6入门(20)-- 如何上传图片、文件

1. 配置文件 设置上传的路径 对应文件夹 2. 前端 <div class"card-body"><h1 class"card-title">用户头像</h1><img src"../../../uploads/{$user.avatar_photo_path}" alt"avatar" height"100"/&g…

【leetcode】深搜、暴搜、回溯、剪枝(C++)2

深搜、暴搜、回溯、剪枝&#xff08;C&#xff09;2 一、括号生成1、题目描述2、代码3、解析 二、组合1、题目描述2、代码3、解析 三、目标和1、题目描述2、代码3、解析 四、组合总和1、题目描述2、代码3、解析 五、字母大小写全排列1、题目描述2、代码3、解析 六、优美的排列1…

C语言学习day13:嵌套循环+练习题(时钟+乘法表)

嵌套循环通常是外面一层for循环&#xff0c;里面n层for循环 代码&#xff1a; int main1601() {//外层执行一次&#xff0c;内层执行一周for (int i 0; i < 5; i){for (int j 0; j < 5; j){printf("i%d,j%d\n",i,j);}}system("pause");return EX…

移动机器人激光SLAM导航(五):Cartographer SLAM 篇

参考 Cartographer 官方文档Cartographer 从入门到精通 1. Cartographer 安装 1.1 前置条件 推荐在刚装好的 Ubuntu 16.04 或 Ubuntu 18.04 上进行编译ROS 安装&#xff1a;ROS学习1&#xff1a;ROS概述与环境搭建 1.2 依赖库安装 资源下载完解压并执行以下指令 https://pa…

搜索专项---最小步数模型

文章目录 魔板 一、魔板OJ链接 本题思路:最小步数模型: 将整个“图”视为一个状态也即一个节点. 状态的转移视为权值为1的边. BFS求解, 注意几点: 状态的存储: 一般用字符串存储状态, 用哈希表存储初始状态到每个状态的距离. 方案记录: 记忆数组存储. 本题中需要存储上一个状…

AI在工业物联网(IIoT)中的安全管理与应用

在开放的工业互联网环境中&#xff0c;数百万个基于物联网的终端和中间设备&#xff0c;需要全天候地持续通信并保持在线状态。不过&#xff0c;这些设备往往由于最初设计上的限制&#xff0c;在机密性、完整性、可用性、扩展性、以及互操作性上&#xff0c;存在着各种安全漏洞…

RK3568笔记十五:触摸屏测试

若该文为原创文章&#xff0c;转载请注明原文出处。 使用正点原子的ATK-RK3568板子&#xff0c;一直在测试屏幕和视频&#xff0c;突然想到触摸屏测试&#xff0c;一直没有用过&#xff0c;原子给的demo跑的是QT系统&#xff0c;触摸功能是正常的&#xff0c;测试一下&#xf…