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类。

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

   

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

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

相关文章

UI设计常见风格(1):一文读懂九个,教你如何辨识。

Hello&#xff0c;我是大千UI工场&#xff0c;设计风格是我们新开辟的栏目&#xff0c;上次讲了毛玻璃风格、辨识方法、应用场景、运用方法等&#xff0c;很受大家欢迎&#xff0c;本次带来常见的风格及辨识&#xff0c;让大家有个总览&#xff0c;以后会逐个讲解的&#xff0c…

【Java】零基础蓝桥杯算法学习——动态规划例题

例题&#xff1a;2023年第十四届蓝桥杯Java软件开发B组E题 蜗牛 参考解答&#xff1a; 参考代码示例&#xff1a; import java.util.Scanner; public class Main {static int N 100010;static int[] arr new int[N];static int[] a new int[N]; //传送带的起始坐标static …

【实战】一、Jest 前端自动化测试框架基础入门(一) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(一)

文章目录 一、前端要学的测试课1.前端要学的测试2.前端工程化的一部分3.前端自动化测试的例子4.前端为什么需要自动化测试&#xff1f;5.课程涵盖内容6.前置技能7.学习收获 二、Jest 前端自动化测试框架基础入门1. 自动化测试背景及原理前端自动化测试产生的背景及原理 2.前端自…

开什么店最稳定轻松?适合一个人开的实体店推荐

在创业的道路上&#xff0c;很多人都希望找到一种稳定轻松的开店方式。 作为一名资深的鲜奶吧创业者&#xff0c;我将分享我的经验和见解&#xff0c;希望能给那些想开实体店的朋友们一些启示&#xff01;&#xff01; 我开鲜奶吧已经有 5 年时间了&#xff0c;目前经营的是鲜…

MIT-BEVFusion系列八--onnx导出1 综述及相机网络导出

目录 综述export-camera.py加载模型加载数据生成需要导出成 onnx 的模块Backbone 模块VTransform 模块 生成 onnx使用 pytorch 原生的伪量化计算方法导出 camera.backbone.onnx导出 camera.vtransform.onnx 综述 bevfusion的各个部分的实现有着鲜明的特点&#xff0c;并且相互…

Harris关键点检测以及SAC-IA粗配准

一、Harris关键点检测 C #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/common/io.h> #include <pcl/keypoints/harris_3d.h> #include <pcl/visualization/pcl_visualizer.h> #include …

摸索设计模式的魅力:从策略模式看软件设计的智慧-灵活应对变化的艺术

设计模式专栏&#xff1a;http://t.csdnimg.cn/U54zu 目录 一、案例场景1.1 一坨坨代码实现1.2 存在的问题 二、使用策略模式解决问题2.1 使用策略模式重构代码2.2 克服了问题 三、模式讲解3.1 结构图及说明3.2 实现步骤和注意事项3.3 适用场景 四、优势和局限性4.1 优势4.2 局…

JSP原理简述

JSP动态网页技术&#xff0c;可以定义html&#xff0c;css&#xff0c;js等静态内容&#xff0c;还可以定义java代码等动态内容。 注意导入坐标时&#xff0c;JSP的scope标签是provided&#xff0c;和servlet一样&#xff0c;否则会报错。 JSP本质上就是一个Servlet&#xff0c…

微信小程序的疑惑总结

未解决&#xff1a; 1.storebindings 这里的storebindings是什么 2.空行怎么写&#xff1f; 我用这个<text>\n</text>写&#xff0c;在模拟器上好使&#xff0c;在真机上显示\n 解决方法&#xff1a;在组件里写class类名&#xff0c;wxss里面改高度 已解决&am…

GAN生成对抗性网络

一、GAN原理 出发点&#xff1a;机器学习中生成模型的问题 无监督学习是机器学习和未来人工智能的突破点&#xff0c;生成模型是无监督学习的关键部分 特点&#xff1a; 不需要MCMC或者变分贝叶斯等复杂的手段&#xff0c;只需要在G和D中对应的多层感知机中运行反向传播或者…

NetMizer 日志管理系统 多处前台RCE漏洞复现

0x01 产品简介 NetMizer是提供集成应用交付和应用安全解决方案以实现业务智能网络的优秀全球供应商,为全球企业和运营商提供确保关键业务应用的全面可用性、高性能和完善的安全性的解决方案。 0x02 漏洞概述 NetMizer 日志管理系统position.php、hostdelay.php、等接口处存在…

Android---Jetpack Compose学习006

1. 点击 clickable 修饰符允许应用检测对已应用该修饰符的元素的点击。 示例&#xff1a;点击控件&#xff0c;使得内容发生改变 class MainActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setCo…

比较不相交5点结构的顺序

( A, B )---6*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有6个节点&#xff0c;AB训练集各由6张二值化的图片组成&#xff0c;让差值结构有5个点&#xff0c;收敛误差7e-4&#xff0c;收敛199次&#xff0c;统计迭代次数平均值并排序。 如果行和列可以自由的变换&#xff0c;5个…

Java中的Stack的基本讲解

目录 一、创建栈 二、Stack的一些常用方法 对于栈的基本概念,我就不细说了&#xff0c;后进先出。比如1,2,3,依次进栈&#xff0c;那么出栈就是3&#xff0c;2&#xff0c;1。 一、创建栈 Stack<引用数据类型&#xff0c;基本数据类使用包装类> snew Stack<>();St…

杂谈--spconv导出中onnx的扩展阅读

Onnx 使用 Onnx 介绍 Onnx (Open Neural Network Exchange) 的本质是一种 Protobuf 格式文件&#xff0c;通常看到的 .onnx 文件其实就是通过 Protobuf 序列化储存的文件。onnx-ml.proto 通过 protoc (Protobuf 提供的编译程序) 编译得到 onnx-ml.pb.h 和 onnx-ml.pb.cc 或 on…

Linux第55步_根文件系统第2步_测试使用busybox生成的根文件系统

测试使用busybox生成的根文件系统。测试内容较多&#xff0c;很杂。 1、修改“nfs-kernel-server” 1)、打开终端 输入“sudo vi /etc/default/nfs-kernel-server回车”&#xff0c;打开“nfs-kernel-server”文件。 输入密码“123456回车” 见下图&#xff1a; 2)、在最后…

Filezilla:文件无法传输的问题

问题 解决方法 我发现我站点管理器原本设置的是FTP, 改成了SFTP就可以正常传输 FTP和SFTP 安全通道&#xff1a;FTP不提供安全通道&#xff0c;SFTP提供安全通道。 传输协议&#xff1a;FTP使用TCP/IP协议&#xff0c;SFTP是SSH协议的一部分。 最后由于SFTP使用了加密解密技…

【并发编程】AQS原理

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;并发编程 ⛺️稳中求进&#xff0c;晒太阳 1. 概述 全称是 AbstractQueuedSynchronizer&#xff0c;是阻塞式锁和相关的同步器工具的框架 特点&#xff1a; 用 state 属性来表示资源的状…

用HTML Canvas和JavaScript创建美丽的花朵动画效果

目录 一、程序代码 二、代码原理 三、运行效果 一、程序代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>炫酷花朵</title><style>* {margin: 0;padding: 0;overflow: hidden;bac…

vue中mapState应用场景及代码示例

这篇文章我们讨论 Vue.js 中 mapState 的详细解释、应用场景、示例代码和使用优势。 mapState 详解&#xff1a; mapState 是 Vuex 中的一个辅助函数&#xff0c;用于将状态映射到组件的计算属性或 methods 中。它允许组件更方便地访问和使用 Vuex 存储中的状态。 通过 map…