OpenCV Mat实例详解 一

news2024/11/29 4:41:08

          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.coloradmin.cn/o/1450253.html

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

相关文章

2024 CKS 题库 | 6、创建 Secret

不等更新题库 CKS 题库 6、创建 Secret Task 在 namespace istio-system 中获取名为 db1-test 的现有 secret 的内容 将 username 字段存储在名为 /cks/sec/user.txt 的文件中&#xff0c;并将password 字段存储在名为 /cks/sec/pass.txt 的文件中。 注意&#xff1a;你必须创…

ubuntu22.04@laptop OpenCV Get Started: 009_image_thresholding

ubuntu22.04laptop OpenCV Get Started: 009_image_thresholding 1. 源由2. image_thresholding应用Demo2.1 C应用Demo2.2 Python应用Demo 3. 重点分析3.1 Binary Thresholding ( THRESH_BINARY )3.2 Inverse-Binary Thresholding ( THRESH_BINARY_INV )3.3 Truncate Threshold…

【AIGC】Stable Diffusion的采样器入门

在 Stable Diffusion 中&#xff0c;采样器&#xff08;Sampler&#xff09;是指用于生成图像的一种技术或方法&#xff0c;它决定了模型如何从潜在空间中抽样并生成图像。采样器在生成图像的过程中起着重要作用&#xff0c;影响着生成图像的多样性、质量和创造性。以下是对 St…

WebStorm | 如何修改webstorm中新建html文件默认生成模板中title的初始值

在近期的JS的学习中&#xff0c;使用webstorm&#xff0c;总是要先新建一个html文件&#xff0c;然后再到里面书写<script>标签&#xff0c;真是麻烦&#xff0c;而且标题也是默认的title&#xff0c;想改成文件名还总是需要手动去改 经过小小的研究&#xff0c;找到了修…

问题:如果要编辑建好的建筑和空间,需要在分级按钮( )和细分操作按钮楼层下,才能选中建筑物和空间; #微信#媒体#其他

问题&#xff1a;如果要编辑建好的建筑和空间&#xff0c;需要在分级按钮&#xff08; &#xff09;和细分操作按钮楼层下&#xff0c;才能选中建筑物和空间&#xff1b; A、楼层 B、规划图 C、全景 D、建筑物 参考答案如图所示

【单总线与DS18B20总结和代码实现】

单总线介绍与总结 单总线介绍单总线时序图DS18B20的操作流程代码 读温度代码思路代码实现 单总线介绍 单总线应用案例&#xff1a;Ds18B20、温湿度传感器用到的就是这个&#xff0c;这里Ds18B20从当的角色是从机部分&#xff0c;而开发板充当的部分人是主机部分。 Ds18B20内部结…

红队打靶练习:HACK ME PLEASE: 1

信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:69:c7:bf, IPv4: 192.168.61.128 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.61.2 00:50:56:f0:df:20 …

ubuntu22.04@laptop OpenCV Get Started: 010_blob_detection

ubuntu22.04laptop OpenCV Get Started: 010_blob_detection 1. 源由2. blob应用Demo2.1 C应用Demo2.2 Python应用Demo 3. 重点分析3.1 Threshold3.2 Area3.3 Circularity3.4 Convexity3.5 Inertia Ratio 4. 总结5. 参考资料6. 补充 1. 源由 Blob是图像中的一组连接像素&#…

Git 初学

目录 一、需求的产生 二、版本控制系统理解 1. 认识版本控制系统 2. 版本控制系统分类 &#xff08;1&#xff09;集中式版本控制系统 缺点&#xff1a; &#xff08;2&#xff09;分布式版本控制系统 三、初识 git 四、git 的使用 例&#xff1a;将 “ OLED文件夹 ”…

STM32物联网(ESP-01S模块及STM32和ESP-01S通信方式介绍)

文章目录 前言一、ESP-01S模块介绍二、STM32和ESP-01S通信方式介绍三、什么是AT指令四、创建基础工程总结 前言 本篇文章我们开始正式进入STM32物联网的专栏&#xff0c;在这个专栏中将会带大家学习使用STM32进行联网&#xff0c;联网模块的话主要就是使用到了ESP-01S WIFI模块…

嵌入式STM32 单片机 GPIO 的工作原理详解

STM32的 GPIO 介绍 GPIO 是通用输入/输出端口的简称&#xff0c;是 STM32 可控制的引脚。GPIO 的引脚与外部硬件设备连接&#xff0c;可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。 以 STM32F103ZET6 芯片为例子&#xff0c;该芯片共有 144 脚芯片&#xff0c…

[word] word技巧分享_word自动编号的标题 #知识分享#知识分享#其他

word技巧分享_word自动编号的标题 日常办公&#xff0c;我们时时都在使用 word 软件。 word 软件内容的组织是通过一节一节的标题进行的。 我们常常需要处理的是下图一样的章节目录

计算机设计大赛 深度学习OCR中文识别 - opencv python

文章目录 0 前言1 课题背景2 实现效果3 文本区域检测网络-CTPN4 文本识别网络-CRNN5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习OCR中文识别系统 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;…

挑战杯 python图像检索系统设计与实现

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; python图像检索系统设计与实现 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&#xff0c…

【C深度解剖】取模与取余

简介&#xff1a;本系列博客为C深度解剖系列内容&#xff0c;以某个点为中心进行相关详细拓展 适宜人群&#xff1a;已大体了解C语法同学 作者留言&#xff1a;本博客相关内容如需转载请注明出处&#xff0c;本人学疏才浅&#xff0c;难免存在些许错误&#xff0c;望留言指正 作…

AJAX——接口文档

1 接口文档 接口文档&#xff1a;描述接口的文章 接口&#xff1a;使用AJAX和服务器通讯时&#xff0c;使用的URL&#xff0c;请求方法&#xff0c;以及参数 传送门&#xff1a;AJAX阶段接口文档 <!DOCTYPE html> <html lang"en"><head><meta c…

【论文精读】GPT2

摘要 在单一领域数据集上训练单一任务的模型是当前系统普遍缺乏泛化能力的主要原因&#xff0c;要想使用当前的架构构建出稳健的系统&#xff0c;可能需要多任务学习。但多任务需要多数据集&#xff0c;而继续扩大数据集和目标设计的规模是个难以处理的问题&#xff0c;所以只能…

【AIGC】Stable Diffusion的ControlNet参数入门

Stable Diffusion 中的 ControlNet 是一种用于控制图像生成过程的技术&#xff0c;它可以指导模型生成特定风格、内容或属性的图像。下面是关于 ControlNet 的界面参数的详细解释&#xff1a; 低显存模式 是一种在深度学习任务中用于处理显存受限设备的技术。在这种模式下&am…

嵌入式I2C 信号线为何加上拉电阻(图文并茂)

IIC 是一个两线串行通信总线&#xff0c;包含一个 SCL 信号和 SDA 信号&#xff0c;SCL 是时钟信号&#xff0c;从主设备发出&#xff0c;SDA 是数据信号&#xff0c;是一个双向的&#xff0c;设备发送数据和接收数据都是通过 SDA 信号。 在设计 IIC 信号电路的时候我们会在 SC…

84 CTF夺旗-PHP弱类型异或取反序列化RCE

目录 案例1&#xff1a;PHP-相关总结知识点-后期复现案例2&#xff1a;PHP-弱类型对比绕过测试-常考点案例3&#xff1a;PHP-正则preg_match绕过-常考点案例4&#xff1a;PHP-命令执行RCE变异绕过-常考点案例5&#xff1a;PHP-反序列化考题分析构造复现-常考点涉及资源&#xf…