OpenCV Mat实例详解 三

        OpenCV Mat实例详解 一、二介绍了,OpenCV Mat类构造函数及其公共属性。下面继续介绍OpenCV Mat类公有静态成员函数

      OpenCV Mat类公有静态成员函数(Static Public Member Functions)

        static CV_NODISCARD_STD Mat    diag (const Mat &d);

        该函数用已有的Mat对象的数据矩阵对角线上的数据填充新创建Mat对象数据矩阵。下面创建一个空的控制台应用程序,来演示其用法·,在程序中加入如下代码:

// OpenCVMatTest3.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{Mat src = (Mat_<uchar>(3, 3 ) << 1, 0, 0,  0, 1, 0,  0, 0, 1);Mat dst = src.diag();cout << src << endl;cout << dst << endl;waitKey(0);return 0;
}

试运行结果如下:

OpenCV Mat类还有一个类似的公有函数,如下:

Mat diag (int d=0) const

d 左上角的位置,如果d值为 负,则为左边算起第一个方阵的右下角。修改上面的代码,来演示该函数的用法,修改后的代码如下:

// OpenCVMatTest3.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{Mat src = (Mat_<uchar>(3, 3 ) << 1, 0, 0,  0, 1, 0,  0, 0, 1);//Mat dst = src.diag();Mat dst = src.diag(0);cout << src << endl;cout << dst << endl;waitKey(0);return 0;
}

  试运行,结果如下:

  修改上面示例代码,修改后如下:         

// OpenCVMatTest3.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{//Mat src = (Mat_<uchar>(3, 3 ) << 1, 0, 0,  0, 1, 0,  0, 0, 1);//Mat dst = src.diag();//Mat dst = src.diag(0);uchar mdata[3][4] = { (1,2,3,4),(5,6,7,8),(9,10,11,12) };Mat src = Mat(3, 4, CV_8UC3, mdata);Mat dst = src.diag(0);cout << src << endl;cout << dst << endl;waitKey(0);return 0;
}

试运行,结果如下: 

 

修改上面示例代码,修改后如下:         

// OpenCVMatTest3.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{//Mat src = (Mat_<uchar>(3, 3 ) << 1, 0, 0,  0, 1, 0,  0, 0, 1);//Mat dst = src.diag();//Mat dst = src.diag(0);uchar mdata[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};Mat src = Mat(3, 4, CV_8UC1, mdata);//Mat dst = src.diag(0);Mat dst = src.diag(1);cout << src << endl;cout << dst << endl;waitKey(0);return 0;
}

 试运行,结果如下: 

修改上面示例代码,修改后如下:         

// OpenCVMatTest3.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{//Mat src = (Mat_<uchar>(3, 3 ) << 1, 0, 0,  0, 1, 0,  0, 0, 1);//Mat dst = src.diag();//Mat dst = src.diag(0);uchar mdata[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};Mat src = Mat(3, 4, CV_8UC1, mdata);//Mat dst = src.diag(0);//Mat dst = src.diag(1);Mat dst = src.diag(2);cout << src << endl;cout << dst << endl;waitKey(0);return 0;
}

 试运行,结果如下:

 试运行,结果如下:

 修改上面示例代码,修改后如下: 

// OpenCVMatTest3.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{//Mat src = (Mat_<uchar>(3, 3 ) << 1, 0, 0,  0, 1, 0,  0, 0, 1);//Mat dst = src.diag();//Mat dst = src.diag(0);uchar mdata[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};Mat src = Mat(3, 4, CV_8UC1, mdata);//Mat dst = src.diag(0);//Mat dst = src.diag(1);//Mat dst = src.diag(2);//Mat dst = src.diag(-1);Mat dst = src.diag(-2);cout << src << endl;cout << dst << endl;waitKey(0);return 0;
}

试运行,结果如下:

static CV_NODISCARD_STD MatExpr  eye (int rows, int cols, int type);

返回一个对角元素为1,其余元素为0的Mat对象

rows 返回Mat对象的rows

cols 返回Mat对象的cols

type 返回Mat对象的type

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

// OpenCVMatTest3.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{//Mat src = (Mat_<uchar>(3, 3 ) << 1, 0, 0,  0, 1, 0,  0, 0, 1);//Mat dst = src.diag();//Mat dst = src.diag(0);//uchar mdata[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};//Mat src = Mat(3, 4, CV_8UC1, mdata);//Mat dst = src.diag(0);//Mat dst = src.diag(1);//Mat dst = src.diag(2);//Mat dst = src.diag(-1);Mat src;Mat dst = src.eye(3, 3, CV_8UC1);cout << "dst cols: " << dst.cols << endl;cout << "dst rows: " << dst.rows << endl;cout << "dst tpye: " << dst.type() << endl;cout << dst << endl;waitKey(0);return 0;
}

试运行,结果如下:

 修改上面示例代码,修改后如下: 

// OpenCVMatTest3.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{//Mat src = (Mat_<uchar>(3, 3 ) << 1, 0, 0,  0, 1, 0,  0, 0, 1);//Mat dst = src.diag();//Mat dst = src.diag(0);//uchar mdata[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};//Mat src = Mat(3, 4, CV_8UC1, mdata);//Mat dst = src.diag(0);//Mat dst = src.diag(1);//Mat dst = src.diag(2);//Mat dst = src.diag(-1);Mat src;Mat dst = src.eye(3, 3, CV_8UC1);src = src.eye(3, 3, CV_8UC1);cout << "dst cols: " << dst.cols << endl;cout << "dst rows: " << dst.rows << endl;cout << "dst tpye: " << dst.type() << endl;cout << "src:" << endl;cout << src << endl;cout << "dst:" << endl;cout << dst << endl;waitKey(0);return 0;
}

试运行,结果如下:

再修改上面示例代码,修改后如下: 

// OpenCVMatTest3.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{//Mat src = (Mat_<uchar>(3, 3 ) << 1, 0, 0,  0, 1, 0,  0, 0, 1);//Mat dst = src.diag();//Mat dst = src.diag(0);//uchar mdata[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};//Mat src = Mat(3, 4, CV_8UC1, mdata);//Mat dst = src.diag(0);//Mat dst = src.diag(1);//Mat dst = src.diag(2);//Mat dst = src.diag(-1);Mat src;Mat dst = src.eye(3, 3, CV_8UC1);//src = src.eye(3, 3, CV_8UC1);cout << "dst cols: " << dst.cols << endl;cout << "dst rows: " << dst.rows << endl;cout << "dst tpye: " << dst.type() << endl;cout << "src:" << endl;cout << src << endl;cout << "dst:" << endl;cout << dst << endl;waitKey(0);return 0;
}

试运行,结果如下:

可以看出,该函数不会改变原有Mat对象。

static CV_NODISCARD_STD MatExpr eye (Size size, int type);

该函数与上一个函数作用一样,仅是用Size代替了cols,与rows。

修改上面的示例代码,来演示其用法,修改后的代码如下:

// OpenCVMatTest3.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{//Mat src = (Mat_<uchar>(3, 3 ) << 1, 0, 0,  0, 1, 0,  0, 0, 1);//Mat dst = src.diag();//Mat dst = src.diag(0);//uchar mdata[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};//Mat src = Mat(3, 4, CV_8UC1, mdata);//Mat dst = src.diag(0);//Mat dst = src.diag(1);//Mat dst = src.diag(2);//Mat dst = src.diag(-1);Mat src;Mat dst = src.eye(Size(3,4), CV_8UC1);cout << "dst cols: " << dst.cols << endl;cout << "dst rows: " << dst.rows << endl;cout << "dst tpye: " << dst.type() << endl;cout << "src:" << endl;cout << src << endl;cout << "dst:" << endl;cout << dst << endl;waitKey(0);return 0;
}

试运行,结果如下: 

从结果可以看出,返回Mat对象数据矩阵如果不是方矩阵,只有左上角为第一个元素的方矩阵对角线上的元素被填充为1,其余元素为0.

static MatAllocator *  getDefaultAllocator ();

修改上面的示例代码,来演示其用法,修改后的代码如下:

	//Mat dst = src.diag();//Mat dst = src.diag(0);//uchar mdata[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};//Mat src = Mat(3, 4, CV_8UC1, mdata);//Mat dst = src.diag(0);//Mat dst = src.diag(1);//Mat dst = src.diag(2);//Mat dst = src.diag(-1);/*Mat src;Mat dst = src.eye(Size(3,4), CV_8UC1);//src = src.eye(3, 3, CV_8UC1);cout << "dst cols: " << dst.cols << endl;cout << "dst rows: " << dst.rows << endl;cout << "dst tpye: " << dst.type() << endl;cout << "src:" << endl;cout << src << endl;cout << "dst:" << endl;cout << dst << endl;*/Mat src = imread("1.jpg");if (src.empty()){cout << "Conn't read image!" << endl;return -1;}MatAllocator* pMem = src.getDefaultAllocator();if (pMem){cout << "Defaultallocator Address:  " << (unsigned int)pMem << endl;}else{cout << "pMem is null" << endl;}imshow("", src);waitKey(0);return 0;
}

试运行,结果如下: 

static MatAllocator *  getStdAllocator ();

修改上面的示例代码,来演示其用法,修改后的代码如下:

	//Mat dst = src.diag();//Mat dst = src.diag(0);//uchar mdata[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};//Mat src = Mat(3, 4, CV_8UC1, mdata);//Mat dst = src.diag(0);//Mat dst = src.diag(1);//Mat dst = src.diag(2);//Mat dst = src.diag(-1);/*Mat src;Mat dst = src.eye(Size(3,4), CV_8UC1);//src = src.eye(3, 3, CV_8UC1);cout << "dst cols: " << dst.cols << endl;cout << "dst rows: " << dst.rows << endl;cout << "dst tpye: " << dst.type() << endl;cout << "src:" << endl;cout << src << endl;cout << "dst:" << endl;cout << dst << endl;*/Mat src = imread("1.jpg");if (src.empty()){cout << "Conn't read image!" << endl;return -1;}//MatAllocator* pMem = src.getDefaultAllocator();MatAllocator* pMem = src.getStdAllocator();if (pMem){cout << "StdAllocator Address:  " << (unsigned int)pMem << endl;}else{cout << "pMem is null" << endl;}imshow("", src);waitKey(0);return 0;
}

试运行,结果如下:

static CV_NODISCARD_STD MatExpr ones (int rows, int cols, int type);

返回一个数据矩阵被填充为1的Mat对象

rows 返回Mat对象的rows

cols 返回Mat对象的cols

type 返回Mat对象的type

修改上面的示例代码,来演示其用法,修改后的代码如下:

// OpenCVMatTest3.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{//Mat src = (Mat_<uchar>(3, 3 ) << 1, 0, 0,  0, 1, 0,  0, 0, 1);//Mat dst = src.diag();//Mat dst = src.diag(0);//uchar mdata[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};//Mat src = Mat(3, 4, CV_8UC1, mdata);//Mat dst = src.diag(0);//Mat dst = src.diag(1);//Mat dst = src.diag(2);//Mat dst = src.diag(-1);/*Mat src;Mat dst = src.eye(Size(3,4), CV_8UC1);//src = src.eye(3, 3, CV_8UC1);cout << "dst cols: " << dst.cols << endl;cout << "dst rows: " << dst.rows << endl;cout << "dst tpye: " << dst.type() << endl;cout << "src:" << endl;cout << src << endl;cout << "dst:" << endl;cout << dst << endl;*//*Mat src = imread("1.jpg");if (src.empty()){cout << "Conn't read image!" << endl;return -1;}//MatAllocator* pMem = src.getDefaultAllocator();MatAllocator* pMem = src.getStdAllocator();if (pMem){cout << "StdAllocator Address:  " << (unsigned int)pMem << endl;}else{cout << "pMem is null" << endl;}imshow("", src);*/Mat src;src = src.ones(3, 5, CV_8UC1);cout << "src cols:  "<< src.cols << endl;cout << "src rows:  " << src.rows << endl;cout << "src type:  " << src.type() << endl;cout << src << endl;waitKey(0);return 0;
}

试运行,结果如下:

static CV_NODISCARD_STD MatExpr  ones (Size size, int type);

这个函数与上一个函数作用相同,Size中包含了rows、cols。

 修改上面的示例代码,来演示其用法,修改后的代码如下:

// OpenCVMatTest3.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{//Mat src = (Mat_<uchar>(3, 3 ) << 1, 0, 0,  0, 1, 0,  0, 0, 1);//Mat dst = src.diag();//Mat dst = src.diag(0);//uchar mdata[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};//Mat src = Mat(3, 4, CV_8UC1, mdata);//Mat dst = src.diag(0);//Mat dst = src.diag(1);//Mat dst = src.diag(2);//Mat dst = src.diag(-1);/*Mat src;Mat dst = src.eye(Size(3,4), CV_8UC1);//src = src.eye(3, 3, CV_8UC1);cout << "dst cols: " << dst.cols << endl;cout << "dst rows: " << dst.rows << endl;cout << "dst tpye: " << dst.type() << endl;cout << "src:" << endl;cout << src << endl;cout << "dst:" << endl;cout << dst << endl;*//*Mat src = imread("1.jpg");if (src.empty()){cout << "Conn't read image!" << endl;return -1;}//MatAllocator* pMem = src.getDefaultAllocator();MatAllocator* pMem = src.getStdAllocator();if (pMem){cout << "StdAllocator Address:  " << (unsigned int)pMem << endl;}else{cout << "pMem is null" << endl;}imshow("", src);*/Mat src;//src = src.ones(3, 5, CV_8UC1);src = src.ones(Size(3,5), CV_8UC1);cout << "src cols:  "<< src.cols << endl;cout << "src rows:  " << src.rows << endl;cout << "src type:  " << src.type() << endl;cout << src << endl;waitKey(0);return 0;
}

试运行,结果如下:

注意Size的两个参数与cols,rows的对应关系。

static CV_NODISCARD_STD MatExpr ones (int ndims, const int *sz, int type);

返回一个数据矩阵被填充为1的Mat对象

ndims 返回Mat对象的维度,1,2有效

*sz 含有返回Mat对象cows,rols数据的int数组

type 返回Mat对象的type

修改上面的示例代码,来演示其用法,修改后的代码如下:

	//Mat dst = src.diag(1);//Mat dst = src.diag(2);//Mat dst = src.diag(-1);/*Mat src;Mat dst = src.eye(Size(3,4), CV_8UC1);//src = src.eye(3, 3, CV_8UC1);cout << "dst cols: " << dst.cols << endl;cout << "dst rows: " << dst.rows << endl;cout << "dst tpye: " << dst.type() << endl;cout << "src:" << endl;cout << src << endl;cout << "dst:" << endl;cout << dst << endl;*//*Mat src = imread("1.jpg");if (src.empty()){cout << "Conn't read image!" << endl;return -1;}//MatAllocator* pMem = src.getDefaultAllocator();MatAllocator* pMem = src.getStdAllocator();if (pMem){cout << "StdAllocator Address:  " << (unsigned int)pMem << endl;}else{cout << "pMem is null" << endl;}imshow("", src);*/int mdat[] = {3,4};Mat src;//src = src.ones(3, 5, CV_8UC1);src = src.ones(2, mdat,CV_8UC1);cout << "src cols:  "<< src.cols << endl;cout << "src rows:  " << src.rows << endl;cout << "src type:  " << src.type() << endl;cout << src << endl;waitKey(0);return 0;
}

试运行,结果如下:

修改上面的示例代码,将ndims的值修改为1,修改后的代码如下:

	//Mat dst = src.diag(0);//uchar mdata[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};//Mat src = Mat(3, 4, CV_8UC1, mdata);//Mat dst = src.diag(0);//Mat dst = src.diag(1);//Mat dst = src.diag(2);//Mat dst = src.diag(-1);/*Mat src;Mat dst = src.eye(Size(3,4), CV_8UC1);//src = src.eye(3, 3, CV_8UC1);cout << "dst cols: " << dst.cols << endl;cout << "dst rows: " << dst.rows << endl;cout << "dst tpye: " << dst.type() << endl;cout << "src:" << endl;cout << src << endl;cout << "dst:" << endl;cout << dst << endl;*//*Mat src = imread("1.jpg");if (src.empty()){cout << "Conn't read image!" << endl;return -1;}//MatAllocator* pMem = src.getDefaultAllocator();MatAllocator* pMem = src.getStdAllocator();if (pMem){cout << "StdAllocator Address:  " << (unsigned int)pMem << endl;}else{cout << "pMem is null" << endl;}imshow("", src);*/int mdat[] = {3,4};Mat src;//src = src.ones(3, 5, CV_8UC1);src = src.ones(1, mdat,CV_8UC1);cout << "src cols:  "<< src.cols << endl;cout << "src rows:  " << src.rows << endl;cout << "src type:  " << src.type() << endl;cout << src << endl;waitKey(0);return 0;
}

试运行,结果如下:

static void setDefaultAllocator (MatAllocator *allocator);

修改上面的示例代码,来演示其用法,修改后的代码如下:

// OpenCVMatTest3.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{//Mat src = (Mat_<uchar>(3, 3 ) << 1, 0, 0,  0, 1, 0,  0, 0, 1);//Mat dst = src.diag();//Mat dst = src.diag(0);//uchar mdata[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};//Mat src = Mat(3, 4, CV_8UC1, mdata);//Mat dst = src.diag(0);//Mat dst = src.diag(1);//Mat dst = src.diag(2);//Mat dst = src.diag(-1);/*Mat src;Mat dst = src.eye(Size(3,4), CV_8UC1);//src = src.eye(3, 3, CV_8UC1);cout << "dst cols: " << dst.cols << endl;cout << "dst rows: " << dst.rows << endl;cout << "dst tpye: " << dst.type() << endl;cout << "src:" << endl;cout << src << endl;cout << "dst:" << endl;cout << dst << endl;*//*Mat src = imread("1.jpg");if (src.empty()){cout << "Conn't read image!" << endl;return -1;}//MatAllocator* pMem = src.getDefaultAllocator();MatAllocator* pMem = src.getStdAllocator();if (pMem){cout << "StdAllocator Address:  " << (unsigned int)pMem << endl;}else{cout << "pMem is null" << endl;}imshow("", src);*//*int mdat[] = {3,4};Mat src;//src = src.ones(3, 5, CV_8UC1);src = src.ones(1, mdat,CV_8UC1);cout << "src cols:  "<< src.cols << endl;cout << "src rows:  " << src.rows << endl;cout << "src type:  " << src.type() << endl;cout << src << endl;*/Mat src = imread("1.jpg");if (src.empty()){cout << "Conn't read image!" << endl;return -1;}src.resize(src.rows / 2, src.cols / 2);MatAllocator* pMem = src.getDefaultAllocator();Mat dst = Mat(src.rows, src.cols, src.type());dst.setDefaultAllocator(pMem);dst.data = src.data;imshow("dst", dst);waitKey(0);return 0;
}

试运行,结果如下:

static CV_NODISCARD_STD MatExpr zeros (int rows, int cols, int type);

static CV_NODISCARD_STD MatExpr zeros (Size size, int type);

static CV_NODISCARD_STD MatExpr  zeros (int ndims, const int *sz, int type);

返回数据矩阵被填充为0的Mat对象

row 返回Mat对象的rows

cols 返回Mat对象的cols

type 返回Mat对象的type

ndims 返回Mat对象的维度,1,2有效。

sz 含有返回Mat对象cols,rows数值的int数组

修改上面的示例代码,来演示这几个函数用法,修改后的代码如下:

// OpenCVMatTest3.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{//Mat src = (Mat_<uchar>(3, 3 ) << 1, 0, 0,  0, 1, 0,  0, 0, 1);//Mat dst = src.diag();//Mat dst = src.diag(0);//uchar mdata[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};//Mat src = Mat(3, 4, CV_8UC1, mdata);//Mat dst = src.diag(0);//Mat dst = src.diag(1);//Mat dst = src.diag(2);//Mat dst = src.diag(-1);/*Mat src;Mat dst = src.eye(Size(3,4), CV_8UC1);//src = src.eye(3, 3, CV_8UC1);cout << "dst cols: " << dst.cols << endl;cout << "dst rows: " << dst.rows << endl;cout << "dst tpye: " << dst.type() << endl;cout << "src:" << endl;cout << src << endl;cout << "dst:" << endl;cout << dst << endl;*//*Mat src = imread("1.jpg");if (src.empty()){cout << "Conn't read image!" << endl;return -1;}//MatAllocator* pMem = src.getDefaultAllocator();MatAllocator* pMem = src.getStdAllocator();if (pMem){cout << "StdAllocator Address:  " << (unsigned int)pMem << endl;}else{cout << "pMem is null" << endl;}imshow("", src);*//*int mdat[] = {3,4};Mat src;//src = src.ones(3, 5, CV_8UC1);src = src.ones(1, mdat,CV_8UC1);cout << "src cols:  "<< src.cols << endl;cout << "src rows:  " << src.rows << endl;cout << "src type:  " << src.type() << endl;cout << src << endl;*//*Mat src = imread("1.jpg");if (src.empty()){cout << "Conn't read image!" << endl;return -1;}src.resize(src.rows / 2, src.cols / 2);MatAllocator* pMem = src.getDefaultAllocator();Mat dst = Mat(src.rows, src.cols, src.type());dst.setDefaultAllocator(pMem);dst.data = src.data;imshow("dst", dst);*/Mat src;src = src.zeros(3, 4, CV_8UC1);cout << "src cols:  " << src.cols << endl;cout << "src rows:  " << src.rows << endl;cout << "src type:  " << src.type() << endl;cout << src << endl;waitKey(0);return 0;
}

试运行,结果如下:

再修改上面的示例代码,修改后的代码如下:

// OpenCVMatTest3.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{//Mat src = (Mat_<uchar>(3, 3 ) << 1, 0, 0,  0, 1, 0,  0, 0, 1);//Mat dst = src.diag();//Mat dst = src.diag(0);//uchar mdata[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};//Mat src = Mat(3, 4, CV_8UC1, mdata);//Mat dst = src.diag(0);//Mat dst = src.diag(1);//Mat dst = src.diag(2);//Mat dst = src.diag(-1);/*Mat src;Mat dst = src.eye(Size(3,4), CV_8UC1);//src = src.eye(3, 3, CV_8UC1);cout << "dst cols: " << dst.cols << endl;cout << "dst rows: " << dst.rows << endl;cout << "dst tpye: " << dst.type() << endl;cout << "src:" << endl;cout << src << endl;cout << "dst:" << endl;cout << dst << endl;*//*Mat src = imread("1.jpg");if (src.empty()){cout << "Conn't read image!" << endl;return -1;}//MatAllocator* pMem = src.getDefaultAllocator();MatAllocator* pMem = src.getStdAllocator();if (pMem){cout << "StdAllocator Address:  " << (unsigned int)pMem << endl;}else{cout << "pMem is null" << endl;}imshow("", src);*//*int mdat[] = {3,4};Mat src;//src = src.ones(3, 5, CV_8UC1);src = src.ones(1, mdat,CV_8UC1);cout << "src cols:  "<< src.cols << endl;cout << "src rows:  " << src.rows << endl;cout << "src type:  " << src.type() << endl;cout << src << endl;*//*Mat src = imread("1.jpg");if (src.empty()){cout << "Conn't read image!" << endl;return -1;}src.resize(src.rows / 2, src.cols / 2);MatAllocator* pMem = src.getDefaultAllocator();Mat dst = Mat(src.rows, src.cols, src.type());dst.setDefaultAllocator(pMem);dst.data = src.data;imshow("dst", dst);*/Mat src;//src = src.zeros(3, 4, CV_8UC1);src = src.zeros(Size(4,3), CV_8UC1);cout << "src cols:  " << src.cols << endl;cout << "src rows:  " << src.rows << endl;cout << "src type:  " << src.type() << endl;cout << src << endl;waitKey(0);return 0;
}

试运行,结果如下:

再修改上面的示例代码,修改后的代码如下:

// OpenCVMatTest3.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{//Mat src = (Mat_<uchar>(3, 3 ) << 1, 0, 0,  0, 1, 0,  0, 0, 1);//Mat dst = src.diag();//Mat dst = src.diag(0);//uchar mdata[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};//Mat src = Mat(3, 4, CV_8UC1, mdata);//Mat dst = src.diag(0);//Mat dst = src.diag(1);//Mat dst = src.diag(2);//Mat dst = src.diag(-1);/*Mat src;Mat dst = src.eye(Size(3,4), CV_8UC1);//src = src.eye(3, 3, CV_8UC1);cout << "dst cols: " << dst.cols << endl;cout << "dst rows: " << dst.rows << endl;cout << "dst tpye: " << dst.type() << endl;cout << "src:" << endl;cout << src << endl;cout << "dst:" << endl;cout << dst << endl;*//*Mat src = imread("1.jpg");if (src.empty()){cout << "Conn't read image!" << endl;return -1;}//MatAllocator* pMem = src.getDefaultAllocator();MatAllocator* pMem = src.getStdAllocator();if (pMem){cout << "StdAllocator Address:  " << (unsigned int)pMem << endl;}else{cout << "pMem is null" << endl;}imshow("", src);*//*int mdat[] = {3,4};Mat src;//src = src.ones(3, 5, CV_8UC1);src = src.ones(1, mdat,CV_8UC1);cout << "src cols:  "<< src.cols << endl;cout << "src rows:  " << src.rows << endl;cout << "src type:  " << src.type() << endl;cout << src << endl;*//*Mat src = imread("1.jpg");if (src.empty()){cout << "Conn't read image!" << endl;return -1;}src.resize(src.rows / 2, src.cols / 2);MatAllocator* pMem = src.getDefaultAllocator();Mat dst = Mat(src.rows, src.cols, src.type());dst.setDefaultAllocator(pMem);dst.data = src.data;imshow("dst", dst);*/int  mdat[] = {3,5 };Mat src;//src = src.zeros(3, 4, CV_8UC1);//src = src.zeros(Size(4,3), CV_8UC1);src = src.zeros(2, mdat,CV_8UC1);cout << "src cols:  " << src.cols << endl;cout << "src rows:  " << src.rows << endl;cout << "src type:  " << src.type() << endl;cout << src << endl;waitKey(0);return 0;
}

试运行,结果如下:

到这里,OpenCV Mat类的静态公有成员函数就介绍完了。

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

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

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

相关文章

云计算基础-存储虚拟化(深信服aSAN分布式存储)

什么是存储虚拟化 分布式存储是利用虚拟化技术 “池化”集群存储卷内通用X86服务器中的本地硬盘&#xff0c;实现服务器存储资源的统一整合、管理及调度&#xff0c;最终向上层提供NFS、ISCSI存储接口&#xff0c;供虚拟机根据自身的存储需求自由分配使用资源池中的存储空间。…

超多有用的c++面试点笔记

1. 指针与引用的区别 指针与引用看上去完全不同(指针用操作符"*“和”->“&#xff0c;引用使用操作符”.")&#xff0c;但是它们似乎有相同的功能。指针和引用都是让你间接引用其它对象。 **在任何情况下都不能使用指向空值的引用。**一个引用必须总是指向某些对…

代码随想录刷题笔记-Day17

1. 路径总和 112. 路径总和https://leetcode.cn/problems/path-sum/ 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true …

【蓝桥杯 2021】图像模糊

图像模糊 题目描述 小蓝有一张黑白图像&#xff0c;由 nm 个像素组成&#xff0c;其中从上到下共 n 行&#xff0c;每行从左到右 m 列。每个像素由一个 0 到 255 之间的灰度值表示。 现在&#xff0c;小蓝准备对图像进行模糊操作&#xff0c;操作的方法为&#xff1a; 对于…

循序渐进-讲解Markdown进阶(Mermaid绘图)-附使用案例

Markdown 进阶操作 查看更多学习笔记&#xff1a;GitHub&#xff1a;LoveEmiliaForever Mermaid官网 由于CSDN对某些Mermaid或Markdown语法不支持&#xff0c;因此我的某些效果展示使用图片进行 下面的笔记内容全部是我根据Mermaid官方文档学习的&#xff0c;因为是初学者所以…

防火墙工作模式详解

防火墙工作模式是指防火墙在网络中的工作方式和策略。常见的防火墙工作模式包括以下几种&#xff1a; 1. 包过滤工作模式&#xff1a;根据事先确定的规则集合&#xff0c;对进出网络的网络包进行过滤和检查。根据规则&#xff0c;防火墙可以允许或阻止特定的网络流量。 2. 代…

记录 | windows pyqt5 pycharm配置

一、下载安装 离线安装 通过PyPI下载 https://pypi.org/ 依此搜索 python_dotenv&#xff0c;PyQt5_sip&#xff0c;PyQt5&#xff0c;pyqt5_tools&#xff0c;注意PyQt5和pyqt5_tools版本对应。 下载之后放在\Anaconda3\Lib\site-packagescmd依次 pip install *.whl 二…

人工智能学习与实训笔记(十四):Langchain Agent

0、概要 Agent是干什么的&#xff1f; Agent的核心思想是使用语言模型&#xff08;LLM&#xff09;作为推理的大脑&#xff0c;以制定解决问题的计划、借助工具实施动作。在agents中几个关键组件如下&#xff1a; Agent&#xff1a;制定计划和思考下一步需要采取的行动。Tools…

跟着pink老师前端入门教程-day27

三、变量 &#xff08;一&#xff09;变量概述 1、什么是变量 白话&#xff1a;变量就是一个装东西的盒子 通俗&#xff1a;变量是用于存放数据的容器&#xff0c;通过变量名获取数据&#xff0c;甚至数据可以修改 2、变量在内存中的存储 本质&#xff1a;变量是程序在内存…

Java毕业设计-基于ssm的网上餐厅管理系统-第72期

获取源码资料&#xff0c;请移步从戎源码网&#xff1a;从戎源码网_专业的计算机毕业设计网站 项目介绍 基于ssm的网上餐厅管理系统&#xff1a;前端jsp、jquery、bootstrap&#xff0c;后端 maven、springmvc、spring、mybatis&#xff0c;集成类名管理、菜品管理、订单管理…

(17)Hive ——MR任务的map与reduce个数由什么决定?

一、MapTask的数量由什么决定&#xff1f; MapTask的数量由以下参数决定 文件个数文件大小blocksize 一般而言&#xff0c;对于每一个输入的文件会有一个map split&#xff0c;每一个分片会开启一个map任务&#xff0c;很容易导致小文件问题&#xff08;如果不进行小文件合并&…

C# CAD 框选pdf输出

在C#中进行AutoCAD二次开发时&#xff0c;实现框选&#xff08;窗口选择&#xff09;实体并输出这些实体到PDF文件通常涉及以下步骤&#xff1a; public ObjectIdCollection GetSelectedEntities() {using (var acTrans HostApplicationServices.WorkingDatabase.Transaction…

代码随想录算法训练营29期Day52|LeetCode 198,213,337

文档讲解&#xff1a;打家劫舍 打家劫舍II 打家劫舍III 198.打家劫舍 题目链接&#xff1a;https://leetcode.cn/problems/house-robber/description/ 思路&#xff1a; 设dp[i]&#xff1a;考虑下标i&#xff08;包括i&#xff09;以内的房屋&#xff0c;最多可以偷窃的金…

Sora:AI视频生产力的颠覆性跃进,让创意瞬间成“视界”!

在AI视频技术宇宙中&#xff0c;RunwayGen2、Stable Video Diffusion和Pika等明星产品早已名声在外。然而&#xff0c;今日横空出世的Sora犹如一颗璀璨新星&#xff0c;以其震撼性的创新突破&#xff0c;在视频制作领域掀起了一场革命&#xff01;相较于市面上同类AI视频神器&a…

【洛谷 P3367】【模板】并查集 题解(并查集+启发式合并)

【模板】并查集 题目描述 如题&#xff0c;现在有一个并查集&#xff0c;你需要完成合并和查询操作。 输入格式 第一行包含两个整数 N , M N,M N,M ,表示共有 N N N 个元素和 M M M 个操作。 接下来 M M M 行&#xff0c;每行包含三个整数 Z i , X i , Y i Z_i,X_i,Y…

力扣57题:插入区间

题目链接】 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 【解题代码】 class Solution {public int[][] insert(int[][] intervals, int[] newInterval) {List<int[]> intervalList new ArrayList<>();boolean newIntervalInsert …

使用 Mermaid 创建流程图,序列图,甘特图

使用 Mermaid 创建流程图和图表 Mermaid 是一个流行的 JavaScript 库&#xff0c;用于创建流程图、序列图、甘特图和其他各种图表。它的简洁语法使得创建图表变得非常简单&#xff0c;无需复杂的绘图工具或专业的编程技能。在本文中&#xff0c;我们将讲解如何使用 Mermaid 来创…

【动态规划】买卖股票问题

1.一次买入&#xff0c;一次卖出 买卖股票1 1.明确dp[i][0] dp[i][1]含义 dp[i][0]:表示可能在前i天(包括第i天)不持有该股票,产生的最大收益 dp[i][1]:表示可能在前i天(包括第i天)持有该股票,产生的最大收益 2.递推公式 dp[i][0]可能在i天之前卖出&#xff0c;所以的dp[i]…

android获取sha1

1.cmd在控制台获取 切换到Android Studio\jre\bin目录下执行keytool -list -v -keystore 签名文件路径例如&#xff1a; 2.也可以在android studio中获取 在Terminal中输入命令&#xff1a;keytool -list -v -keystore 签名文件路径获取 获取到的sha1如下&#xff1a;

理解并实现OpenCV中的图像平滑技术

导读 图像模糊&#xff08;也称为图像平滑&#xff09;是计算机视觉和图像处理中的基本操作之一。模糊图像通常是噪声减少、边缘检测和特征提取等应用的第一步。在本博客中&#xff0c;我们将重点介绍如何使用Python中的OpenCV库应用多种模糊技术。 理论概述&#xff1a; 基本…