opencv子矩阵操作

来源:互联网 发布:java递归计算n的阶乘 编辑:程序博客网 时间:2024/05/16 05:26

作者:gnuhpc 
出处:http://www.cnblogs.com/gnuhpc/

view plainprint?
  1. #include "highgui.h"  
  2. #include "cv.h"  
  3. #include <iostream>  
  4. #include <iomanip>  
  5.   
  6.   
  7. using namespace std;  
  8.   
  9. void main()  
  10. {  
  11. int i=0;  
  12. int j=0;  
  13. CvRect mat_rect=cvRect(1,1,3,3);//指定取得数组子集的范围  
  14. CvMat *mat=cvCreateMat(6,6,CV_64FC1);//原数组  
  15. CvMat *submat=cvCreateMat(3,3,CV_64FC1);//按mat_rect指定取得的数组子集  
  16. CvMat *mat_rows=cvCreateMat(2,6,CV_64FC1);//按一定跨度内的行取得的数组子集  
  17. /*对这个6*6的矩阵初始化*/  
  18. for (i=0;i<6;i++)  
  19. {  
  20. for (j=0;j<6;j++)  
  21. {  
  22. CV_MAT_ELEM(*mat,double,i,j)=i*6+j;  
  23. }  
  24. }  
  25. /*打印源矩阵*/  
  26. for (i=0;i<6;i++)  
  27. {  
  28. for (j=0;j<6;j++)  
  29. {  
  30. cout<<setw(3)<<CV_MAT_ELEM(*mat,double,i,j);  
  31. }  
  32. cout<<endl;  
  33. }  
  34. cout<<endl;  
  35. /*取子数组,大小根据mat_rect来决定,然后打印*/  
  36. cvGetSubRect(mat,submat,mat_rect);  
  37. for (i=0;i<3;i++)  
  38. {  
  39. for (j=0;j<3;j++)  
  40. {  
  41. cout<<setw(3)<<CV_MAT_ELEM(*submat,double,i,j);  
  42. }  
  43. cout<<endl;  
  44. }  
  45. cout<<endl;  
  46. /*取第一行(从0开始)取到第(3-1=)2行,并打印*/  
  47. cvGetRows(mat,mat_rows,1,3,1);  
  48. for (i=0;i<2;i++)  
  49. {  
  50. for (j=0;j<6;j++)  
  51. {  
  52. cout<<setw(3)<<CV_MAT_ELEM(*mat_rows,double,i,j);  
  53. }  
  54. cout<<endl;  
  55. }  
  56. cvReleaseMat(&mat);  
  57. cvReleaseMat(&submat);  
  58. cvReleaseMat(&mat_rows);  
  59. }  

在OpenCV中一般取元素都用定义好的宏: 
取Mat结构的元素的宏为CV_MAT_ELEM,它取2D的矩阵最方便。 
取IplImage元素的宏为CV_IMAGE_ELEM,如取一个图像(x,y)点的灰度值: 
uchar *ptr=CV_IAMGE_ELEM(image,uchar,i,j*3); 
ptr[0],ptr[1],ptr[2]就是对应的B/G/R三个分量了。


               作者:gnuhpc 
               出处:http://www.cnblogs.com/gnuhpc/ 
               除非另有声明,本网站采用知识共享“署名 2.5 中国大陆”许可协议授权。

0 0