当前位置:   article > 正文

OpenCV Mat 实例详解 二

OpenCV Mat 实例详解 二

   构造函数

      OpenCV Mat实例详解一中已介绍了部分OpenCV Mat构造函数,下面继续介绍剩余部分构造函数。

Mat (const std::vector< _Tp > &vec, bool copyData=false);

vec 包含数据的vec对象

copyData 是否拷贝数据,true— 拷贝数据,false—不拷贝数据。

下面新建一个控制台应用程序,来演示,该构造函数的使用,在新建程序中加入如下代码:

  1. // OpenCVMatTest2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  2. //
  3. #include <iostream>
  4. #include <opencv2/opencv.hpp>
  5. using namespace cv;
  6. using namespace std;
  7. int main()
  8. {
  9. vector<uchar> vec = {1,2,3,4,5,6,7,8,9};
  10. Mat tmp = Mat(vec, 1);
  11. if (tmp.empty())
  12. cout << "构建Mat对象失败!" << endl;
  13. else
  14. cout << "构建Mat对象成功!" << endl;
  15. waitKey(0);
  16. return 0;
  17. }

试运行结果如下:

说明构建Mat对象成功。

Mat (const std::initializer_list< _Tp > list); 

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

  1. // OpenCVMatTest2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  2. #include <iostream>
  3. #include <opencv2/opencv.hpp>
  4. using namespace cv;
  5. using namespace std;
  6. int main()
  7. {
  8. //vector<uchar> vec = {1,2,3,4,5,6,7,8,9};
  9. //Mat tmp = Mat(vec, 1);
  10. initializer_list<uchar> list = { 1,2,3,4,5,6,7,8,9 };
  11. Mat tmp = Mat(list);
  12. if (tmp.empty())
  13. cout << "构建Mat对象失败!" << endl;
  14. else
  15. cout << "构建Mat对象成功!" << endl;
  16. waitKey(0);
  17. return 0;
  18. }

试运行,结果如下:

Mat (const std::initializer_list< int > sizes, const std::initializer_list< _Tp > list);

sizes 构建对象维度参数(rows,cols)

list 包含数据对的list对象

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

  1. // OpenCVMatTest2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  2. #include <iostream>
  3. #include <opencv2/opencv.hpp>
  4. using namespace cv;
  5. using namespace std;
  6. int main()
  7. {
  8. //vector<uchar> vec = {1,2,3,4,5,6,7,8,9};
  9. //Mat tmp = Mat(vec, 1);
  10. initializer_list<uchar> list = {1,2,3,4,5,6,7,8,9,10,11,12};
  11. //Mat tmp = Mat(list);
  12. initializer_list<int> list1 = {3,4};
  13. Mat tmp = Mat(list1,list);
  14. if (tmp.empty())
  15. cout << "构建Mat对象失败!" << endl;
  16. else
  17. {
  18. cout << "构建Mat对象成功!" << endl;
  19. cout << "构建Mat对象rows:" << tmp.rows << endl;
  20. cout << "构建Mat对象cols:" << tmp.cols << endl;
  21. }
  22. waitKey(0);
  23. return 0;
  24. }

试运行,结果如下:

Mat (const std::array< _Tp, _Nm > &arr, bool copyData=false);

arr含有构建Mat对象数据的array对象

copyData 是否拷贝数据,true— 拷贝数据,false—不拷贝数据。

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

  1. // OpenCVMatTest2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  2. #include <iostream>
  3. #include <opencv2/opencv.hpp>
  4. using namespace cv;
  5. using namespace std;
  6. int main()
  7. {
  8. //vector<uchar> vec = {1,2,3,4,5,6,7,8,9};
  9. //Mat tmp = Mat(vec, 1);
  10. //initializer_list<uchar> list = {1,2,3,4,5,6,7,8,9,10,11,12};
  11. //Mat tmp = Mat(list);
  12. //initializer_list<int> list1 = {3,4};
  13. array<uchar,12> arr = { 1,2,3,4,5,6,7,8,9,10,11,12 };
  14. Mat tmp = Mat(arr,1);
  15. if (tmp.empty())
  16. cout << "构建Mat对象失败!" << endl;
  17. else
  18. {
  19. cout << "构建Mat对象成功!" << endl;
  20. cout << "构建Mat对象rows:" << tmp.rows << endl;
  21. cout << "构建Mat对象cols:" << tmp.cols << endl;
  22. }
  23. waitKey(0);
  24. return 0;
  25. }

试运行,结果如下:

Mat (const Vec< _Tp, n > &vec, bool copyData=true);

vec包含构建Mat对象数据的Vec对象

 copyData 是否拷贝数据,true— 拷贝数据,false—不拷贝数据。

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

  1. // OpenCVMatTest2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  2. #include <iostream>
  3. #include <opencv2/opencv.hpp>
  4. using namespace cv;
  5. using namespace std;
  6. int main()
  7. {
  8. //vector<uchar> vec = {1,2,3,4,5,6,7,8,9};
  9. //Mat tmp = Mat(vec, 1);
  10. //initializer_list<uchar> list = {1,2,3,4,5,6,7,8,9,10,11,12};
  11. //Mat tmp = Mat(list);
  12. //initializer_list<int> list1 = {3,4};
  13. //array<uchar,12> arr = { 1,2,3,4,5,6,7,8,9,10,11,12 };
  14. //Mat tmp = Mat(arr,1);
  15. Vec<uchar,12> vec = { 1,2,3,4,5,6,7,8,9,10,11,12 };
  16. Mat tmp = Mat(vec, 1);
  17. if (tmp.empty())
  18. cout << "构建Mat对象失败!" << endl;
  19. else
  20. {
  21. cout << "构建Mat对象成功!" << endl;
  22. cout << "构建Mat对象rows:" << tmp.rows << endl;
  23. cout << "构建Mat对象cols:" << tmp.cols << endl;
  24. }
  25. waitKey(0);
  26. return 0;
  27. }

试运行,结果如下:

Mat (const Matx< _Tp, m, n > &mtx, bool copyData=true);

mtx含有构建对象数据的Matx对象

copyData 是否拷贝数据,true— 拷贝数据,false—不拷贝数据。

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

  1. // OpenCVMatTest2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  2. #include <iostream>
  3. #include <opencv2/opencv.hpp>
  4. using namespace cv;
  5. using namespace std;
  6. int main()
  7. {
  8. //vector<uchar> vec = {1,2,3,4,5,6,7,8,9};
  9. //Mat tmp = Mat(vec, 1);
  10. //initializer_list<uchar> list = {1,2,3,4,5,6,7,8,9,10,11,12};
  11. //Mat tmp = Mat(list);
  12. //initializer_list<int> list1 = {3,4};
  13. //array<uchar,12> arr = { 1,2,3,4,5,6,7,8,9,10,11,12 };
  14. //Mat tmp = Mat(arr,1);
  15. //Vec<uchar,12> vec = { 1,2,3,4,5,6,7,8,9,10,11,12 };
  16. //Mat tmp = Mat(vec, 1);
  17. Matx<uchar,3,4> mtx = { 1,2,3,4,5,6,7,8,9,10,11,12 };
  18. Mat tmp = Mat(mtx, 1);
  19. if (tmp.empty())
  20. cout << "构建Mat对象失败!" << endl;
  21. else
  22. {
  23. cout << "构建Mat对象成功!" << endl;
  24. cout << "构建Mat对象rows:" << tmp.rows << endl;
  25. cout << "构建Mat对象cols:" << tmp.cols << endl;
  26. }
  27. waitKey(0);
  28. return 0;
  29. }

试运行,结果如下:

Mat (const Point_< _Tp > &pt, bool copyData=true); 

pt 含构建Mat数据的point对象,以point对象的x,y坐标作为Mat对象数据

copyData 是否拷贝数据,true— 拷贝数据,false—不拷贝数据。

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

  1. // OpenCVMatTest2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  2. #include <iostream>
  3. #include <opencv2/opencv.hpp>
  4. using namespace cv;
  5. using namespace std;
  6. int main()
  7. {
  8. //vector<uchar> vec = {1,2,3,4,5,6,7,8,9};
  9. //Mat tmp = Mat(vec, 1);
  10. //initializer_list<uchar> list = {1,2,3,4,5,6,7,8,9,10,11,12};
  11. //Mat tmp = Mat(list);
  12. //initializer_list<int> list1 = {3,4};
  13. //array<uchar,12> arr = { 1,2,3,4,5,6,7,8,9,10,11,12 };
  14. //Mat tmp = Mat(arr,1);
  15. //Vec<uchar,12> vec = { 1,2,3,4,5,6,7,8,9,10,11,12 };
  16. //Mat tmp = Mat(vec, 1);
  17. //Matx<uchar,3,4> mtx = { 1,2,3,4,5,6,7,8,9,10,11,12 };
  18. Point_<int> point;
  19. point.x = 100;
  20. point.y = 100;
  21. Mat tmp = Mat(point, true);
  22. if (tmp.empty())
  23. cout << "构建Mat对象失败!" << endl;
  24. else
  25. {
  26. cout << "构建Mat对象成功!" << endl;
  27. cout << "构建Mat对象rows:" << tmp.rows << endl;
  28. cout << "构建Mat对象cols:" << tmp.cols << endl;
  29. }
  30. waitKey(0);
  31. return 0;
  32. }

试运行,结果如下:

Mat (const Point3_< _Tp > &pt, bool copyData=true)

pt 含构建Mat数据的point对象,以point对象的x,y,z坐标作为Mat对象数据

copyData 是否拷贝数据,true— 拷贝数据,false—不拷贝数据。

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

  1. // OpenCVMatTest2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  2. #include <iostream>
  3. #include <opencv2/opencv.hpp>
  4. using namespace cv;
  5. using namespace std;
  6. int main()
  7. {
  8. //vector<uchar> vec = {1,2,3,4,5,6,7,8,9};
  9. //Mat tmp = Mat(vec, 1);
  10. //initializer_list<uchar> list = {1,2,3,4,5,6,7,8,9,10,11,12};
  11. //Mat tmp = Mat(list);
  12. //initializer_list<int> list1 = {3,4};
  13. //array<uchar,12> arr = { 1,2,3,4,5,6,7,8,9,10,11,12 };
  14. //Mat tmp = Mat(arr,1);
  15. //Vec<uchar,12> vec = { 1,2,3,4,5,6,7,8,9,10,11,12 };
  16. //Mat tmp = Mat(vec, 1);
  17. //Matx<uchar,3,4> mtx = { 1,2,3,4,5,6,7,8,9,10,11,12 };
  18. //Point_<int> point;
  19. Point3_<int> point;
  20. point.x = 100;
  21. point.y = 100;
  22. point.z = 100;
  23. Mat tmp = Mat(point, true);
  24. if (tmp.empty())
  25. cout << "构建Mat对象失败!" << endl;
  26. else
  27. {
  28. cout << "构建Mat对象成功!" << endl;
  29. cout << "构建Mat对象rows:" << tmp.rows << endl;
  30. cout << "构建Mat对象cols:" << tmp.cols << endl;
  31. }
  32. waitKey(0);
  33. return 0;
  34. }

运行结果如下:

除了用上面的构造函数构建Mat对象外,还可以以下面方式构建并初始化Mat对象:

Mat tmp = (Mat_<uchar>(3,3)<< 1, 0, 0, 0, 1, 0, 0, 0, 1); 

Mat类的公共属性

 Mat类有一下公共属性:

MatAllocator *  allocator

int cols

uchar *  data

const uchar *  dataend

const uchar * datalimit

const uchar *  datastart

int  dims

int flags

int rows

MatSize  size

MatStep  step

UMatData *  u

Mat类对象的共公属性可以用.运算符访问.有部分属性已在前面的示例中使用过,这里就不再做介绍了。

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

    

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号