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;供虚拟机根据自身的存储需求自由分配使用资源池中的存储空间。…

代码随想录刷题笔记-Day17

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

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

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

记录 | 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;如果不进行小文件合并&…

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

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

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

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

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; 基本…

【报告解析】OpenAI Sora视频模型官方报告全解析 | 效果,能力以及基本原理

省流版 1 核心数据处理将视频数据整合成一个一个的Patch&#xff0c;方便统一训练数据&#xff0c;利用扩散Transformer架构 2 功能效果除了可以实现基础的文生视频外&#xff0c;实际上还有非常惊艳的视频延展&#xff0c;视频编辑&#xff0c;视频连接等多种功能&#xff0…

算法--数论二

这里写目录标题 高斯消元高斯消元求线性方程组用途高斯消元的数学思想例题代码 二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 高斯消元 高斯消元求线性方程组 用途 这个…

VScode写LaTeX配置,实测有效

环境配置请看LaTeX环境配置-TexLive&#xff0c;实测有效http://t.csdnimg.cn/0txlL VScode写LaTeX配置 0.smatra pdf下载 如果使用外部pdf查看器&#xff0c;比如我用的sumatra pdf,官网是Sumatra PDF reader download page 下载对应版本&#xff0c;比如64位&#xff0c;下…

Pandas:DataFrame的完整指南【第82篇—DataFrame】

Pandas&#xff1a;DataFrame的完整指南 Pandas是Python中最流行的数据处理库之一&#xff0c;而其中的DataFrame对象是数据处理的核心。DataFrame为我们提供了一个强大而灵活的数据结构&#xff0c;使得数据的清洗、分析和可视化变得更加简便。在本文中&#xff0c;我们将深入…

leetcode hot100爬楼梯

在本题目中&#xff0c;要求爬第n阶有多少种爬法&#xff0c;并且每次只能爬1个或者2个&#xff0c;这明显是动态规划的问题&#xff0c;我们需要用动态规划的解决方式去处理问题。动态规划就是按照正常的顺序由前向后依次推导。而递归则是从结果往前去寻找&#xff08;个人理解…

Android 9.0 禁用adb shell input输入功能

1.前言 在9.0的系统rom产品开发中,在进行一些定制开发中,对于一些adb shell功能需要通过属性来控制禁止使用input 等输入功能,比如adb shell input keyevent 响应输入事件等,所以就需要 熟悉adb shell input的输入事件流程,然后来禁用adb shell input的输入事件功能,接…

光芒绽放:妙用“GLAD原则”打造标准的数据可视化图表

光芒绽放&#xff1a;妙用“GLAD原则”打造标准的数据可视化图表 文章目录 光芒绽放&#xff1a;妙用“GLAD原则”打造标准的数据可视化图表前言一、可视化工具有哪些&#xff1f;二、那如何做出正确可视化图表 &#xff1f;GLAD原则1.G原则2.L原则3.A原则4.D原则 三、总结最后…

《VulnStack》ATTCK-1

title: 《VulnStack》ATT&CK-1 date: 2024-01-29 14:53:49 updated: 2024-02-14 18:55:49 categories: WriteUp&#xff1a;Cyber-Range excerpt: 主机发现、端口扫描&#xff0c;服务探测&#xff0c;操作系统探测、nmap 漏洞库扫描、网站首页信息泄露、msf 渗透与信息收集…