当前位置:   article > 正文

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中。如下:

  1. #define CV_8U 0
  2. #define CV_8S 1
  3. #define CV_16U 2
  4. #define CV_16S 3
  5. #define CV_32S 4
  6. #define CV_32F 5
  7. #define CV_64F 6
  8. #define CV_16F 7
  9. #define CV_MAKE_TYPE CV_MAKETYPE
  10. #define CV_8UC1 CV_MAKETYPE(CV_8U,1)
  11. #define CV_8UC2 CV_MAKETYPE(CV_8U,2)
  12. #define CV_8UC3 CV_MAKETYPE(CV_8U,3)
  13. #define CV_8UC4 CV_MAKETYPE(CV_8U,4)
  14. #define CV_8UC(n) CV_MAKETYPE(CV_8U,(n))
  15. #define CV_8SC1 CV_MAKETYPE(CV_8S,1)
  16. #define CV_8SC2 CV_MAKETYPE(CV_8S,2)
  17. #define CV_8SC3 CV_MAKETYPE(CV_8S,3)
  18. #define CV_8SC4 CV_MAKETYPE(CV_8S,4)
  19. #define CV_8SC(n) CV_MAKETYPE(CV_8S,(n))
  20. #define CV_16UC1 CV_MAKETYPE(CV_16U,1)
  21. #define CV_16UC2 CV_MAKETYPE(CV_16U,2)
  22. #define CV_16UC3 CV_MAKETYPE(CV_16U,3)
  23. #define CV_16UC4 CV_MAKETYPE(CV_16U,4)
  24. #define CV_16UC(n) CV_MAKETYPE(CV_16U,(n))
  25. #define CV_16SC1 CV_MAKETYPE(CV_16S,1)
  26. #define CV_16SC2 CV_MAKETYPE(CV_16S,2)
  27. #define CV_16SC3 CV_MAKETYPE(CV_16S,3)
  28. #define CV_16SC4 CV_MAKETYPE(CV_16S,4)
  29. #define CV_16SC(n) CV_MAKETYPE(CV_16S,(n))
  30. #define CV_32SC1 CV_MAKETYPE(CV_32S,1)
  31. #define CV_32SC2 CV_MAKETYPE(CV_32S,2)
  32. #define CV_32SC3 CV_MAKETYPE(CV_32S,3)
  33. #define CV_32SC4 CV_MAKETYPE(CV_32S,4)
  34. #define CV_32SC(n) CV_MAKETYPE(CV_32S,(n))
  35. #define CV_32FC1 CV_MAKETYPE(CV_32F,1)
  36. #define CV_32FC2 CV_MAKETYPE(CV_32F,2)
  37. #define CV_32FC3 CV_MAKETYPE(CV_32F,3)
  38. #define CV_32FC4 CV_MAKETYPE(CV_32F,4)
  39. #define CV_32FC(n) CV_MAKETYPE(CV_32F,(n))
  40. #define CV_64FC1 CV_MAKETYPE(CV_64F,1)
  41. #define CV_64FC2 CV_MAKETYPE(CV_64F,2)
  42. #define CV_64FC3 CV_MAKETYPE(CV_64F,3)
  43. #define CV_64FC4 CV_MAKETYPE(CV_64F,4)
  44. #define CV_64FC(n) CV_MAKETYPE(CV_64F,(n))
  45. #define CV_16FC1 CV_MAKETYPE(CV_16F,1)
  46. #define CV_16FC2 CV_MAKETYPE(CV_16F,2)
  47. #define CV_16FC3 CV_MAKETYPE(CV_16F,3)
  48. #define CV_16FC4 CV_MAKETYPE(CV_16F,4)
  49. #define CV_16FC(n) CV_MAKETYPE(CV_16F,(n))

下面以实例演示其用法

        在VS 中新建一个C++ 控制台程序,完成代码如下:

  1. // OpenCVMatTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  2. #include <iostream>
  3. #include <opencv2/opencv.hpp>
  4. using namespace cv;
  5. using namespace std;
  6. int main()
  7. {
  8. Mat tmp(100,200, CV_8U);
  9. cout <<"构造Mat对象的高度为: " << tmp.rows << endl;
  10. cout << "构造Mat对象的宽度为: " << tmp.cols << endl;
  11. cout << "构造Mat对象的数据类型为: " << tmp.type() << endl;
  12. }

试运行,结果如下:

说明已成功构造对象。将构造函数的type直接输入0,也是同样的结果。如下:

 Mat tmp(100, 200,0);

如果将type参数用CV_8UC1替代结果又如何,如下:

  1. // OpenCVMatTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  2. #include <iostream>
  3. #include <opencv2/opencv.hpp>
  4. using namespace cv;
  5. using namespace std;
  6. int main()
  7. {
  8. //Mat tmp(100,200, CV_8U);
  9. Mat tmp(100, 200, CV_8UC1);
  10. cout <<"构造Mat对象的高度为: " << tmp.rows << endl;
  11. cout << "构造Mat对象的宽度为: " << tmp.cols << endl;
  12. cout << "构造Mat对象的数据类型为: " << tmp.type() << endl;
  13. }

试运行的结果,如下:

结果并未发生改变。修改代码如下:

  1. // OpenCVMatTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  2. #include <iostream>
  3. #include <opencv2/opencv.hpp>
  4. using namespace cv;
  5. using namespace std;
  6. int main()
  7. {
  8. //Mat tmp(100,200, CV_8U);
  9. Mat tmp(100, 200, CV_8UC1);
  10. cout <<"构造Mat对象的高度为: " << tmp.rows << endl;
  11. cout << "构造Mat对象的宽度为: " << tmp.cols << endl;
  12. cout << "构造Mat对象的通道数为: " << tmp.channels() << endl;
  13. cout << "构造Mat对象的位深度为: " << tmp.depth() << endl;
  14. cout << "构造Mat对象的数据类型为: " << tmp.type() << endl;
  15. }

、试运行,结果如下:

再次修改代码如下:

  1. // OpenCVMatTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  2. #include <iostream>
  3. #include <opencv2/opencv.hpp>
  4. using namespace cv;
  5. using namespace std;
  6. int main()
  7. {
  8. //Mat tmp(100,200, CV_8U);
  9. Mat tmp(100, 200, CV_8UC2);
  10. cout <<"构造Mat对象的高度为: " << tmp.rows << endl;
  11. cout << "构造Mat对象的宽度为: " << tmp.cols << endl;
  12. cout << "构造Mat对象的通道数为: " << tmp.channels() << endl;
  13. cout << "构造Mat对象的位深度为: " << tmp.depth() << endl;
  14. cout << "构造Mat对象的数据类型为: " << tmp.type() << endl;
  15. }

试运行,结果如下:

可以看出数据类型与通道数发生了改变,位深度是0,即8位。再修改代码改成如下:

  1. // OpenCVMatTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  2. #include <iostream>
  3. #include <opencv2/opencv.hpp>
  4. using namespace cv;
  5. using namespace std;
  6. int main()
  7. {
  8. //Mat tmp(100,200, CV_8U);
  9. //Mat tmp(100, 200, CV_8UC2);
  10. Mat tmp(100, 200, CV_8SC3);
  11. cout <<"构造Mat对象的高度为: " << tmp.rows << endl;
  12. cout << "构造Mat对象的宽度为: " << tmp.cols << endl;
  13. cout << "构造Mat对象的通道数为: " << tmp.channels() << endl;
  14. cout << "构造Mat对象的位深度为: " << tmp.depth() << endl;
  15. cout << "构造Mat对象的数据类型为: " << tmp.type() << endl;
  16. }

试运行结果如下:

 说明type参数与位深度与通道数相关。从数据类型定义即可看出,如CV_8UC1其中的8U表示位深度为0,即8位无符号数据,C1表示通道数为1。

        Mat (Size size, int type);

这个构造函数与上面构造函数,只不过用Size参数代替了rows、cols参数。下面演示其使用。将上面的示例代码修改如下:

  1. // OpenCVMatTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  2. #include <iostream>
  3. #include <opencv2/opencv.hpp>
  4. using namespace cv;
  5. using namespace std;
  6. int main()
  7. {
  8. //Mat tmp(100,200, CV_8U);
  9. //Mat tmp(100, 200, CV_8UC2);
  10. //Mat tmp(100, 200, CV_8SC3);
  11. Mat tmp(Size(100, 200), CV_16UC3);
  12. cout <<"构造Mat对象的高度为: " << tmp.rows << endl;
  13. cout << "构造Mat对象的宽度为: " << tmp.cols << endl;
  14. cout << "构造Mat对象的通道数为: " << tmp.channels() << endl;
  15. cout << "构造Mat对象的位深度为: " << tmp.depth() << endl;
  16. cout << "构造Mat对象的数据类型为: " << tmp.type() << endl;
  17. }

试运行,结果如下:

可以看出Size的第一个参数是cols,第二个参数是rows,这点需要注意。

MatMat (int rows, int cols, int type, const Scalar &s)

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

  1. // OpenCVMatTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  2. #include <iostream>
  3. #include <opencv2/opencv.hpp>
  4. using namespace cv;
  5. using namespace std;
  6. int main()
  7. {
  8. //Mat tmp(100,200, CV_8U);
  9. //Mat tmp(100, 200, CV_8UC2);
  10. //Mat tmp(100, 200, CV_8SC3);
  11. Mat tmp = Mat(Size(400, 200), CV_8UC3, Scalar(255,0,0));
  12. cout <<"构造Mat对象的高度为: " << tmp.rows << endl;
  13. cout << "构造Mat对象的宽度为: " << tmp.cols << endl;
  14. cout << "构造Mat对象的通道数为: " << tmp.channels() << endl;
  15. cout << "构造Mat对象的位深度为: " << tmp.depth() << endl;
  16. cout << "构造Mat对象的数据类型为: " << tmp.type() << endl;
  17. cout << "构造Mat对象的Size为: " << tmp.size() << endl;
  18. imshow("构造图像", tmp);
  19. 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的数组名

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

  1. // OpenCVMatTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  2. #include <iostream>
  3. #include <opencv2/opencv.hpp>
  4. using namespace cv;
  5. using namespace std;
  6. int main()
  7. {
  8. //Mat tmp(100,200, CV_8U);
  9. //Mat tmp(100, 200, CV_8UC2);
  10. //Mat tmp(100, 200, CV_8SC3);
  11. //Mat tmp = Mat(Size(400, 200), CV_8UC3, Scalar(255,0,0));
  12. int size[] = {400,200};
  13. Mat tmp = Mat(2, size, CV_8UC3, Scalar(0,255,0));
  14. cout <<"构造Mat对象的高度为: " << tmp.rows << endl;
  15. cout << "构造Mat对象的宽度为: " << tmp.cols << endl;
  16. cout << "构造Mat对象的通道数为: " << tmp.channels() << endl;
  17. cout << "构造Mat对象的位深度为: " << tmp.depth() << endl;
  18. cout << "构造Mat对象的数据类型为: " << tmp.type() << endl;
  19. cout << "构造Mat对象的Size为: " << tmp.size() << endl;
  20. imshow("构造图像", tmp);
  21. waitKey(0);
  22. }

试运行后,结果如下:

 可以看出,数组的第一个元素被作为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参数

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

  1. // OpenCVMatTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  2. #include <iostream>
  3. #include <opencv2/opencv.hpp>
  4. using namespace cv;
  5. using namespace std;
  6. int main()
  7. {
  8. //Mat tmp(100,200, CV_8U);
  9. //Mat tmp(100, 200, CV_8UC2);
  10. //Mat tmp(100, 200, CV_8SC3);
  11. //Mat tmp = Mat(Size(400, 200), CV_8UC3, Scalar(255,0,0));
  12. //int size[] = {400,200};
  13. // Mat tmp = Mat(2, size, CV_8UC3, Scalar(0,255,0));
  14. //Mat tmp = Mat(1, size, CV_8UC3, Scalar(0, 255, 0));
  15. vector<int> size(2);
  16. size[0] = 400;
  17. size[1] = 200;
  18. Mat tmp = Mat(size, CV_8UC3, Scalar(0, 255, 0));
  19. cout <<"构造Mat对象的高度为: " << tmp.rows << endl;
  20. cout << "构造Mat对象的宽度为: " << tmp.cols << endl;
  21. cout << "构造Mat对象的通道数为: " << tmp.channels() << endl;
  22. cout << "构造Mat对象的位深度为: " << tmp.depth() << endl;
  23. cout << "构造Mat对象的数据类型为: " << tmp.type() << endl;
  24. cout << "构造Mat对象的Size为: " << tmp.size() << endl;
  25. imshow("构造图像", tmp);
  26. waitKey(0);
  27. }

试运行,结果如下:

 可以看出已成功构造对象,且vector对象的第一个元素作为rows,第二个元素作为cols。

Mat (const Mat &m)

以已有的Mat对象,构造新的·Mat对象。m: Mat源

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

  1. // OpenCVMatTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  2. #include <iostream>
  3. #include <opencv2/opencv.hpp>
  4. using namespace cv;
  5. using namespace std;
  6. int main()
  7. {
  8. //Mat tmp(100,200, CV_8U);
  9. //Mat tmp(100, 200, CV_8UC2);
  10. //Mat tmp(100, 200, CV_8SC3);
  11. //Mat tmp = Mat(Size(400, 200), CV_8UC3, Scalar(255,0,0));
  12. //int size[] = {400,200};
  13. // Mat tmp = Mat(2, size, CV_8UC3, Scalar(0,255,0));
  14. //Mat tmp = Mat(1, size, CV_8UC3, Scalar(0, 255, 0));
  15. //vector<int> size(2);
  16. //size[0] = 400;
  17. //size[1] = 200;
  18. //Mat tmp = Mat(size, CV_8UC3, Scalar(0, 255, 0));
  19. Mat src = imread("1.jpg");
  20. src.resize(src.rows / 2, src.cols / 2);
  21. Mat tmp = Mat(src);
  22. cout <<"构造Mat对象的高度为: " << tmp.rows << endl;
  23. cout << "构造Mat对象的宽度为: " << tmp.cols << endl;
  24. cout << "构造Mat对象的通道数为: " << tmp.channels() << endl;
  25. cout << "构造Mat对象的位深度为: " << tmp.depth() << endl;
  26. cout << "构造Mat对象的数据类型为: " << tmp.type() << endl;
  27. cout << "构造Mat对象的Size为: " << tmp.size() << endl;
  28. cout << "构造Mat对象的Step为: " << tmp.step << endl;
  29. imshow("构造图像", tmp);
  30. waitKey(0);
  31. }

试运行,结果如下:

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的指针。

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

  1. // OpenCVMatTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  2. #include <iostream>
  3. #include <opencv2/opencv.hpp>
  4. using namespace cv;
  5. using namespace std;
  6. int main()
  7. {
  8. //Mat tmp(100,200, CV_8U);
  9. //Mat tmp(100, 200, CV_8UC2);
  10. //Mat tmp(100, 200, CV_8SC3);
  11. //Mat tmp = Mat(Size(400, 200), CV_8UC3, Scalar(255,0,0));
  12. //int size[] = {400,200};
  13. // Mat tmp = Mat(2, size, CV_8UC3, Scalar(0,255,0));
  14. //Mat tmp = Mat(1, size, CV_8UC3, Scalar(0, 255, 0));
  15. //vector<int> size(2);
  16. //size[0] = 400;
  17. //size[1] = 200;
  18. //Mat tmp = Mat(size, CV_8UC3, Scalar(0, 255, 0));
  19. Mat src = imread("1.jpg");
  20. src.resize(src.rows / 2, src.cols / 2);
  21. //Mat tmp = Mat(src);
  22. Mat tmp = Mat(src.rows, src.cols, src.type(),src.data);
  23. cout <<"构造Mat对象的高度为: " << tmp.rows << endl;
  24. cout << "构造Mat对象的宽度为: " << tmp.cols << endl;
  25. cout << "构造Mat对象的通道数为: " << tmp.channels() << endl;
  26. cout << "构造Mat对象的位深度为: " << tmp.depth() << endl;
  27. cout << "构造Mat对象的数据类型为: " << tmp.type() << endl;
  28. cout << "构造Mat对象的Size为: " << tmp.size() << endl;
  29. cout << "构造Mat对象的Step为: " << tmp.step << endl;
  30. imshow("构造图像", tmp);
  31. waitKey(0);
  32. }

试运行,结果如下:

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

  1. // OpenCVMatTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  2. #include <iostream>
  3. #include <opencv2/opencv.hpp>
  4. using namespace cv;
  5. using namespace std;
  6. int main()
  7. {
  8. //Mat tmp(100,200, CV_8U);
  9. //Mat tmp(100, 200, CV_8UC2);
  10. //Mat tmp(100, 200, CV_8SC3);
  11. //Mat tmp = Mat(Size(400, 200), CV_8UC3, Scalar(255,0,0));
  12. //int size[] = {400,200};
  13. // Mat tmp = Mat(2, size, CV_8UC3, Scalar(0,255,0));
  14. //Mat tmp = Mat(1, size, CV_8UC3, Scalar(0, 255, 0));
  15. //vector<int> size(2);
  16. //size[0] = 400;
  17. //size[1] = 200;
  18. //Mat tmp = Mat(size, CV_8UC3, Scalar(0, 255, 0));
  19. Mat src = imread("1.jpg");
  20. src.resize(src.rows / 2, src.cols / 2);
  21. //Mat tmp = Mat(src);
  22. //Mat tmp = Mat(src.rows, src.cols, src.type(),src.data);
  23. Mat tmp = Mat(src.size(), src.type(), src.data);
  24. cout <<"构造Mat对象的高度为: " << tmp.rows << endl;
  25. cout << "构造Mat对象的宽度为: " << tmp.cols << endl;
  26. cout << "构造Mat对象的通道数为: " << tmp.channels() << endl;
  27. cout << "构造Mat对象的位深度为: " << tmp.depth() << endl;
  28. cout << "构造Mat对象的数据类型为: " << tmp.type() << endl;
  29. cout << "构造Mat对象的Size为: " << tmp.size() << endl;
  30. cout << "构造Mat对象的Step为: " << tmp.step << endl;
  31. imshow("构造图像", tmp);
  32. waitKey(0);
  33. }

试运行,结果如下:

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

  1. // OpenCVMatTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  2. #include <iostream>
  3. #include <opencv2/opencv.hpp>
  4. using namespace cv;
  5. using namespace std;
  6. int main()
  7. {
  8. //Mat tmp(100,200, CV_8U);
  9. //Mat tmp(100, 200, CV_8UC2);
  10. //Mat tmp(100, 200, CV_8SC3);
  11. //Mat tmp = Mat(Size(400, 200), CV_8UC3, Scalar(255,0,0));
  12. //int size[] = {400,200};
  13. // Mat tmp = Mat(2, size, CV_8UC3, Scalar(0,255,0));
  14. //Mat tmp = Mat(1, size, CV_8UC3, Scalar(0, 255, 0));
  15. //vector<int> size(2);
  16. //size[0] = 400;
  17. //size[1] = 200;
  18. //Mat tmp = Mat(size, CV_8UC3, Scalar(0, 255, 0));
  19. Mat src = imread("1.jpg");
  20. src.resize(src.rows / 2, src.cols / 2);
  21. //Mat tmp = Mat(src);
  22. //Mat tmp = Mat(src.rows, src.cols, src.type(),src.data);
  23. //Mat tmp = Mat(src.size(), src.type(), src.data);
  24. Mat tmp = Mat(700,800, CV_8UC3, src.data+800*3);
  25. cout <<"构造Mat对象的高度为: " << tmp.rows << endl;
  26. cout << "构造Mat对象的宽度为: " << tmp.cols << endl;
  27. cout << "构造Mat对象的通道数为: " << tmp.channels() << endl;
  28. cout << "构造Mat对象的位深度为: " << tmp.depth() << endl;
  29. cout << "构造Mat对象的数据类型为: " << tmp.type() << endl;
  30. cout << "构造Mat对象的Size为: " << tmp.size() << endl;
  31. cout << "构造Mat对象的Step为: " << tmp.step << endl;
  32. imshow("构造图像", tmp);
  33. waitKey(0);
  34. }

试运行,结果如下: 

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的数据,实质上已有图像构建感兴趣区域对象。

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

  1. // OpenCVMatTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  2. #include <iostream>
  3. #include <opencv2/opencv.hpp>
  4. using namespace cv;
  5. using namespace std;
  6. int main()
  7. {
  8. //Mat tmp(100,200, CV_8U);
  9. //Mat tmp(100, 200, CV_8UC2);
  10. //Mat tmp(100, 200, CV_8SC3);
  11. //Mat tmp = Mat(Size(400, 200), CV_8UC3, Scalar(255,0,0));
  12. //int size[] = {400,200};
  13. // Mat tmp = Mat(2, size, CV_8UC3, Scalar(0,255,0));
  14. //Mat tmp = Mat(1, size, CV_8UC3, Scalar(0, 255, 0));
  15. //vector<int> size(2);
  16. //size[0] = 400;
  17. //size[1] = 200;
  18. //Mat tmp = Mat(size, CV_8UC3, Scalar(0, 255, 0));
  19. Mat src = imread("1.jpg");
  20. src.resize(src.rows / 2, src.cols / 2);
  21. //Mat tmp = Mat(src);
  22. //Mat tmp = Mat(src.rows, src.cols, src.type(),src.data);
  23. //Mat tmp = Mat(src.size(), src.type(), src.data);
  24. //Mat tmp = Mat(700,800, CV_8UC3, src.data+800*3);
  25. Range rowRange = Range(0, 700);
  26. Range colRange = Range(0, 700);
  27. Mat tmp = Mat(src, rowRange, colRange);
  28. cout <<"构造Mat对象的高度为: " << tmp.rows << endl;
  29. cout << "构造Mat对象的宽度为: " << tmp.cols << endl;
  30. cout << "构造Mat对象的通道数为: " << tmp.channels() << endl;
  31. cout << "构造Mat对象的位深度为: " << tmp.depth() << endl;
  32. cout << "构造Mat对象的数据类型为: " << tmp.type() << endl;
  33. cout << "构造Mat对象的Size为: " << tmp.size() << endl;
  34. cout << "构造Mat对象的Step为: " << tmp.step << endl;
  35. imshow("构造图像", tmp);
  36. waitKey(0);
  37. }

试运行,结果如下:

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

  1. #include <iostream>
  2. #include <opencv2/opencv.hpp>
  3. using namespace cv;
  4. using namespace std;
  5. int main()
  6. {
  7. //Mat tmp(100,200, CV_8U);
  8. //Mat tmp(100, 200, CV_8UC2);
  9. //Mat tmp(100, 200, CV_8SC3);
  10. //Mat tmp = Mat(Size(400, 200), CV_8UC3, Scalar(255,0,0));
  11. //int size[] = {400,200};
  12. // Mat tmp = Mat(2, size, CV_8UC3, Scalar(0,255,0));
  13. //Mat tmp = Mat(1, size, CV_8UC3, Scalar(0, 255, 0));
  14. //vector<int> size(2);
  15. //size[0] = 400;
  16. //size[1] = 200;
  17. //Mat tmp = Mat(size, CV_8UC3, Scalar(0, 255, 0));
  18. Mat src = imread("1.jpg");
  19. src.resize(src.rows / 2, src.cols / 2);
  20. //Mat tmp = Mat(src);
  21. //Mat tmp = Mat(src.rows, src.cols, src.type(),src.data);
  22. //Mat tmp = Mat(src.size(), src.type(), src.data);
  23. //Mat tmp = Mat(700,800, CV_8UC3, src.data+800*3);
  24. //Range rowRange = Range(0, 700);
  25. //Range colRange = Range(0, 700);
  26. //Mat tmp = Mat(src, rowRange, colRange);
  27. Rect rec = Rect(100, 0, 700, 700);
  28. Mat tmp = Mat(src, rec);
  29. cout <<"构造Mat对象的高度为: " << tmp.rows << endl;
  30. cout << "构造Mat对象的宽度为: " << tmp.cols << endl;
  31. cout << "构造Mat对象的通道数为: " << tmp.channels() << endl;
  32. cout << "构造Mat对象的位深度为: " << tmp.depth() << endl;
  33. cout << "构造Mat对象的数据类型为: " << tmp.type() << endl;
  34. cout << "构造Mat对象的Size为: " << tmp.size() << endl;
  35. cout << "构造Mat对象的Step为: " << tmp.step << endl;
  36. imshow("构造图像", tmp);
  37. waitKey(0);
  38. }

试运行,结果如下:

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

  1. #include <iostream>
  2. #include <opencv2/opencv.hpp>
  3. using namespace cv;
  4. using namespace std;
  5. int main()
  6. {
  7. //Mat tmp(100,200, CV_8U);
  8. //Mat tmp(100, 200, CV_8UC2);
  9. //Mat tmp(100, 200, CV_8SC3);
  10. //Mat tmp = Mat(Size(400, 200), CV_8UC3, Scalar(255,0,0));
  11. //int size[] = {400,200};
  12. // Mat tmp = Mat(2, size, CV_8UC3, Scalar(0,255,0));
  13. //Mat tmp = Mat(1, size, CV_8UC3, Scalar(0, 255, 0));
  14. //vector<int> size(2);
  15. //size[0] = 400;
  16. //size[1] = 200;
  17. //Mat tmp = Mat(size, CV_8UC3, Scalar(0, 255, 0));
  18. Mat src = imread("1.jpg");
  19. src.resize(src.rows / 2, src.cols / 2);
  20. //Mat tmp = Mat(src);
  21. //Mat tmp = Mat(src.rows, src.cols, src.type(),src.data);
  22. //Mat tmp = Mat(src.size(), src.type(), src.data);
  23. //Mat tmp = Mat(700,800, CV_8UC3, src.data+800*3);
  24. //Range rowRange = Range(0, 700);
  25. //Range colRange = Range(0, 700);
  26. //Mat tmp = Mat(src, rowRange, colRange);
  27. //Rect rec = Rect(100, 0, 700, 700);
  28. //Mat tmp = Mat(src, rec);
  29. Range rowRange = Range(0, 700);
  30. Range colRange = Range(100, 700);
  31. Range ranges[] = {rowRange, colRange};
  32. Mat tmp = Mat(src, ranges);
  33. cout <<"构造Mat对象的高度为: " << tmp.rows << endl;
  34. cout << "构造Mat对象的宽度为: " << tmp.cols << endl;
  35. cout << "构造Mat对象的通道数为: " << tmp.channels() << endl;
  36. cout << "构造Mat对象的位深度为: " << tmp.depth() << endl;
  37. cout << "构造Mat对象的数据类型为: " << tmp.type() << endl;
  38. cout << "构造Mat对象的Size为: " << tmp.size() << endl;
  39. cout << "构造Mat对象的Step为: " << tmp.step << endl;
  40. imshow("构造图像", tmp);
  41. waitKey(0);
  42. }

试运行,结果如下:

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

  1. // OpenCVMatTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  2. #include <iostream>
  3. #include <opencv2/opencv.hpp>
  4. using namespace cv;
  5. using namespace std;
  6. int main()
  7. {
  8. //Mat tmp(100,200, CV_8U);
  9. //Mat tmp(100, 200, CV_8UC2);
  10. //Mat tmp(100, 200, CV_8SC3);
  11. //Mat tmp = Mat(Size(400, 200), CV_8UC3, Scalar(255,0,0));
  12. //int size[] = {400,200};
  13. // Mat tmp = Mat(2, size, CV_8UC3, Scalar(0,255,0));
  14. //Mat tmp = Mat(1, size, CV_8UC3, Scalar(0, 255, 0));
  15. //vector<int> size(2);
  16. //size[0] = 400;
  17. //size[1] = 200;
  18. //Mat tmp = Mat(size, CV_8UC3, Scalar(0, 255, 0));
  19. Mat src = imread("1.jpg");
  20. src.resize(src.rows / 2, src.cols / 2);
  21. //Mat tmp = Mat(src);
  22. //Mat tmp = Mat(src.rows, src.cols, src.type(),src.data);
  23. //Mat tmp = Mat(src.size(), src.type(), src.data);
  24. //Mat tmp = Mat(700,800, CV_8UC3, src.data+800*3);
  25. //Range rowRange = Range(0, 700);
  26. //Range colRange = Range(0, 700);
  27. //Mat tmp = Mat(src, rowRange, colRange);
  28. //Rect rec = Rect(100, 0, 700, 700);
  29. //Mat tmp = Mat(src, rec);
  30. Range rowRange = Range(0, 700);
  31. Range colRange = Range(100, 700);
  32. //Range ranges[] = {rowRange, colRange};
  33. //Mat tmp = Mat(src, ranges);
  34. vector<Range> ranges1(2);
  35. ranges1[0] = rowRange;
  36. ranges1[1] = colRange;
  37. Mat tmp = Mat(src, ranges1);
  38. cout <<"构造Mat对象的高度为: " << tmp.rows << endl;
  39. cout << "构造Mat对象的宽度为: " << tmp.cols << endl;
  40. cout << "构造Mat对象的通道数为: " << tmp.channels() << endl;
  41. cout << "构造Mat对象的位深度为: " << tmp.depth() << endl;
  42. cout << "构造Mat对象的数据类型为: " << tmp.type() << endl;
  43. cout << "构造Mat对象的Size为: " << tmp.size() << endl;
  44. cout << "构造Mat对象的Step为: " << tmp.step << endl;
  45. imshow("构造图像", tmp);
  46. waitKey(0);
  47. }

由于篇幅关系,OpenCV构造函数暂时介绍在这里,将在下篇博文中继续介绍OpenCV Mat类。

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

   

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/116215
推荐阅读
相关标签
  

闽ICP备14008679号