opencv Mat的几种初始化方式

转载于:https://blog.csdn.net/jeakon/article/details/41942197

参考文章: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. }

运行结果:


  


        </div>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值