OpenCV Mat实例详解 一

这篇具有很好参考价值的文章主要介绍了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;
}

试运行,结果如下:

OpenCV Mat实例详解 一,opencv,人工智能,计算机视觉,OpenCV Mat实例详解一,OpenCV Mat类构造函数

说明已成功构造对象。将构造函数的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;
}

试运行的结果,如下:

OpenCV Mat实例详解 一,opencv,人工智能,计算机视觉,OpenCV Mat实例详解一,OpenCV 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_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;
}

、试运行,结果如下:

OpenCV Mat实例详解 一,opencv,人工智能,计算机视觉,OpenCV Mat实例详解一,OpenCV 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);
    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;
}

试运行,结果如下:

OpenCV Mat实例详解 一,opencv,人工智能,计算机视觉,OpenCV Mat实例详解一,OpenCV Mat类构造函数

可以看出数据类型与通道数发生了改变,位深度是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;
}

试运行结果如下:

OpenCV Mat实例详解 一,opencv,人工智能,计算机视觉,OpenCV Mat实例详解一,OpenCV Mat类构造函数 说明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;
}

试运行,结果如下:

OpenCV Mat实例详解 一,opencv,人工智能,计算机视觉,OpenCV Mat实例详解一,OpenCV Mat类构造函数

可以看出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);

试运行,结果如下:

OpenCV Mat实例详解 一,opencv,人工智能,计算机视觉,OpenCV Mat实例详解一,OpenCV Mat类构造函数

可以看出,已经构造出蓝色图片的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);
}

试运行后,结果如下:

OpenCV Mat实例详解 一,opencv,人工智能,计算机视觉,OpenCV Mat实例详解一,OpenCV Mat类构造函数

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

OpenCV Mat实例详解 一,opencv,人工智能,计算机视觉,OpenCV Mat实例详解一,OpenCV Mat类构造函数

可以看出,构造对象图片的列变成了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);
}

试运行,结果如下:

OpenCV Mat实例详解 一,opencv,人工智能,计算机视觉,OpenCV Mat实例详解一,OpenCV Mat类构造函数

 可以看出已成功构造对象,且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);
}

试运行,结果如下:

OpenCV Mat实例详解 一,opencv,人工智能,计算机视觉,OpenCV Mat实例详解一,OpenCV Mat类构造函数

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

试运行,结果如下:

OpenCV Mat实例详解 一,opencv,人工智能,计算机视觉,OpenCV Mat实例详解一,OpenCV 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);
    //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);
}

试运行,结果如下:

OpenCV Mat实例详解 一,opencv,人工智能,计算机视觉,OpenCV Mat实例详解一,OpenCV 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);
    //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);
}

试运行,结果如下: 

OpenCV Mat实例详解 一,opencv,人工智能,计算机视觉,OpenCV Mat实例详解一,OpenCV Mat类构造函数

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


试运行,结果如下:

OpenCV Mat实例详解 一,opencv,人工智能,计算机视觉,OpenCV Mat实例详解一,OpenCV Mat类构造函数

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

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

试运行,结果如下:

OpenCV Mat实例详解 一,opencv,人工智能,计算机视觉,OpenCV Mat实例详解一,OpenCV Mat类构造函数

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

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

试运行,结果如下:

OpenCV Mat实例详解 一,opencv,人工智能,计算机视觉,OpenCV Mat实例详解一,OpenCV 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);
    //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文章来源地址https://www.toymoban.com/news/detail-826682.html

   

到了这里,关于OpenCV Mat实例详解 一的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [当人工智能遇上安全] 8.基于API序列和机器学习的恶意家族分类实例详解

    您或许知道,作者后续分享网络安全的文章会越来越少。但如果您想学习人工智能和安全结合的应用,您就有福利了,作者将重新打造一个《当人工智能遇上安全》系列博客,详细介绍人工智能与安全相关的论文、实践,并分享各种案例,涉及恶意代码检测、恶意请求识别、

    2024年02月09日
    浏览(30)
  • [当人工智能遇上安全] 9.基于API序列和深度学习的恶意家族分类实例详解

    您或许知道,作者后续分享网络安全的文章会越来越少。但如果您想学习人工智能和安全结合的应用,您就有福利了,作者将重新打造一个《当人工智能遇上安全》系列博客,详细介绍人工智能与安全相关的论文、实践,并分享各种案例,涉及恶意代码检测、恶意请求识别、

    2024年02月04日
    浏览(42)
  • opencv Mat详解

    我们有多种方法从现实世界获取数字图像:数码相机、扫描仪、计算机断层扫描和磁共振成像等。在任何情况下,人类看到的都是图像。当将其转换为数字图像在设备中进行存储时,我们记录的是图像中每个点的数值。 例如,在上面的图像中,可以看到汽车的镜子只是一个包

    2024年02月07日
    浏览(30)
  • OpenCV快速入门七:Mat详解

    一切图像皆Mat: Mat是一个类,由矩阵头——说明书(尺寸、存储方法、存储地址、引用次数)和指向存储所有像素值的矩阵指针构成。 1.Mat基本结构 以C++为例 1.构造法 也可用ones,zeros,创建空白图像: 但三通道使用ones只赋值第一个通道,要全部赋值可用Scalar(B,G,R) 2.克隆 3

    2024年02月05日
    浏览(23)
  • 阶段五:深度学习和人工智能(学习人工智能的应用领域,如自然语言处理,计算机视觉等)

    Python是人工智能领域最流行的编程语言之一,它具有简单易学、功能强大、库丰富等优点,因此在自然语言处理、计算机视觉等领域得到了广泛应用。 自然语言处理 自然语言处理是人工智能领域的一个重要分支,它主要研究如何让计算机理解和处理人类语言。Python在自然语

    2024年02月04日
    浏览(64)
  • 深入探索人工智能与计算机视觉

    在当今数字化时代,人工智能(AI)和计算机视觉(CV)作为两大前沿技术,正以惊人的速度改变着我们的生活。本文将深入探讨人工智能与计算机视觉的关系、应用以及未来发展方向。 1. 人工智能与计算机视觉的关系 人工智能是一门涵盖众多技术领域的学科,旨在使计算机

    2024年04月14日
    浏览(45)
  • 探索人工智能 | 智能推荐系统 未来没有人比计算机更懂你

    智能推荐系统(Recommendation Systems)利用机器学习和数据挖掘技术,根据用户的兴趣和行为,提供个性化推荐的产品、内容或服务。 智能推荐系统是一种利用机器学习和数据分析技术的应用程序,旨在根据用户的兴趣、偏好和行为模式,向其推荐个性化的产品、服务或内容。

    2024年02月13日
    浏览(36)
  • 【人工智能课程】计算机科学博士作业一

    模型拟合:用深度神经网络拟合一个回归模型。从各种角度对其改进,评价指标为MSE。 掌握技巧: 熟悉并掌握深度学习模型训练的基本技巧。 提高PyTorch的使用熟练度。 掌握改进深度学习的方法。 数据集下载: Kaggle下载数据: https://www.kaggle.com/competitions/ml2022spring-hw1 百度云

    2024年01月23日
    浏览(41)
  • 【人工智能课程】计算机科学博士作业三

    来源:李宏毅2022课程第10课的作业 图片攻击是指故意对数字图像进行修改,以使机器学习模型产生错误的输出或者产生预期之外的结果。这种攻击是通过将微小的、通常对人类难以察觉的扰动应用于输入图像来实现的。图片攻击是对深度学习系统中的鲁棒性和安全性的一种测

    2024年03月16日
    浏览(57)
  • 人工智能与计算机辅助决策的技术融合

    人工智能(Artificial Intelligence, AI)和计算机辅助决策(Computer-Aided Decision, CAD)是两个不同的领域,但它们之间存在密切的联系和相互作用。人工智能主要关注于模拟和创造人类智能的机器,包括学习、理解自然语言、视觉识别、推理和决策等方面。而计算机辅助决策则关注于利用

    2024年02月22日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包