当前位置:   article > 正文

OpenCV基本图像容器Mat的几种创建方法_cv::mat 使用外部地址

cv::mat 使用外部地址

参考文章:http://www.cnblogs.com/tornadomeet/archive/2012/07/19/2599376.html

实验说明: (引用)

  本文主要讲一些opencv 2.0版本后出现的Mat矩形类,主要是参考opencv自带doc文件夹下的tutiol教材。通过这次实验觉得用Mat的话下面几点需要特别注意(在代码中可以体现出来):

1. 利用create函数重新改变Mat数据在内存中的布局。 
2. 注意多通道数据在Mat中其实也是占一个元素的位置的。 
3. 学会多维Mat的创建方法。
4. 当Mat矩阵比较小时,学会直接赋值的方法,即用Mat_。
5. 掌握Mat矩阵内容输出到终端时的几种常见格式。
6. 注意如果vector是单独一维的话需要转换成Mat才能输出,多维的可以直接输出,例如vector里面存放的是点的话。

  1. #include <iostream>
  2. #include <opencv2/core/core.hpp>
  3. #include <opencv2/highgui/highgui.hpp>
  4. #include <opencv2/imgproc/imgproc.hpp>
  5. using namespace std;
  6. using namespace cv;
  7. int demo_Mat()
  8. {
  9. int next_num = 1;
  10. char tmp;
  11. while(next_num<7)
  12. {
  13. cout<<"-------- "<<next_num<<" --------"<<endl;
  14. waitKey(0);
  15. switch (next_num)
  16. {
  17. case 1:
  18. {
  19. Mat M( 2, 2, CV_8UC3, Scalar(0,255,0) );//其实是2*6的矩阵,因为每个元素有3个通道。
  20. cout<<"create by using the constructor..."<<endl;
  21. cout<<"M = \n "<<M<<endl;
  22. M.create( 4, 4, CV_8UC(2));//括号里面的2表示2通道
  23. cout<< "create by using create function..."<<endl;
  24. cout<<"M = \n "<<M<<endl;
  25. break;
  26. }//当case语句里面变量定义时,需要用括号括起来,否则会报错
  27. case 2:
  28. {
  29. int sz[3] = {2, 2, 2};
  30. Mat L( 3, sz, CV_8UC(1), Scalar::all(0) );
  31. cout<< "create multidimensional matrix..."<<endl;
  32. // cout<<"L = "<<L<<endl;此处不能打印出来,因为那只适应二维数组
  33. break;
  34. }
  35. case 3:
  36. {
  37. Mat E = Mat::eye(4, 4, CV_64F);
  38. Mat O = Mat::ones(2, 3, CV_32F);
  39. Mat Z = Mat::zeros(3, 3, CV_8UC1);
  40. cout<< "using matlab stytle..."<<endl;
  41. cout<<"E = \n "<<E<<endl;
  42. cout<<"O = \n "<<O<<endl;
  43. cout<<"Z = \n "<<Z<<endl;
  44. break;
  45. }
  46. case 4:
  47. {
  48. Mat C =(Mat_<double>(3,3)<<0,-1,0,-1,5,-1,0,-1,0);//直接赋初始值的方法
  49. Mat row_clone = C.row(1).clone();
  50. cout<< "create 3*3 double-precision identity matrix..."<<endl;
  51. cout<<"C = \n "<<C<<endl;
  52. cout<<"row_clone = "<<row_clone<<endl;
  53. break;
  54. }
  55. case 5:
  56. {
  57. Mat R = Mat( 3, 2, CV_8UC3 );
  58. randu( R, Scalar::all(0), Scalar::all(255) );
  59. cout<< "fill a matrix with rand numbers..."<<endl;
  60. cout<<"R (default) = "<<R<<endl;
  61. cout<< "demonstrate the output formating options..."<<endl;
  62. cout<<"R (python) = \n "<<format(R, "python")<<endl;
  63. cout<<"R (numpy) = \n "<<format(R, "numpy")<<endl;//numpy是一个用python实现的科学计算包
  64. cout<<"R (csv) = \n "<<format(R, "csv")<<endl;//csv,逗号分隔符
  65. cout<<"R (c) = \n " <<format(R, "C")<<endl;
  66. break;
  67. }
  68. case 6:
  69. {
  70. cout<< "the point format output..."<<endl;
  71. Point2f P1(5, 1);
  72. cout<<"Point (2D) = "<<P1<<endl;
  73. Point3f P2(4, 5, 6);
  74. cout<<"Point (3D) = "<<P2<<endl;
  75. vector<float>v;
  76. v.push_back( (float)CV_PI);
  77. v.push_back( 2 );//push_back为在其尾部加入一个数据
  78. v.push_back( 3.01f );
  79. cout<<"vector of float: = "<<Mat(v)<<endl;//vector数据是没法单独输出的,因此可以借助mat输出
  80. int N = 20;
  81. vector<Point2f>vPoints(N);//vector可以用变量定义其长度,比数组好用
  82. for( size_t E = 0; E < vPoints.size(); ++E ) //size_t其实就是一个unsigned int类型
  83. vPoints[E] = Point2f((float)(E*5), (float)(E%7));
  84. cout<<"vPoints[] = \n"<<vPoints<<endl;//但是vector点确实可以直接输出的,因为这时候的vector本身就是
  85. //一个多维(至少2维)Mat了
  86. break;
  87. }
  88. default:
  89. break;
  90. }
  91. next_num++;
  92. }
  93. return 0;
  94. }

运行结果:


  


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

闽ICP备14008679号