歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> OpenCV中打印CvMat的元素

OpenCV中打印CvMat的元素

日期:2017/3/1 10:10:37   编辑:Linux編程

這裡定義一個函數ecvOutputMatrix,用於打印CvMat的元素。下面有兩個例子。

例一在Debug時有誤,而在Release時沒有問題,這由CV_MAT_ELEM的定義可見,其中有assert表達式,使得CV_MAT_ELEM在Debug情況下只能應用於單通道矩陣,實際上在Release情況下CV_MAT_ELEM還是可以應用於多通道矩陣的。

鑒於CV_MAT_ELEM的缺點,在例二中仿照CV_MAT_ELEM定義了三個宏,分別用於訪問二三四通道矩陣中的元素。注意所定義的宏並沒有保證row,col和cha小於矩陣的行數,列數和通道數,讀者可以自行添加相應的assert表達式。

  1. #define CV_MAT_ELEM_2(mat,type,row,col,cha) (((type*)((mat).data.ptr+row*(mat).step))[2*col+cha])
  2. #define CV_MAT_ELEM_3(mat,type,row,col,cha) (((type*)((mat).data.ptr+row*(mat).step))[3*col+cha])
  3. #define CV_MAT_ELEM_4(mat,type,row,col,cha) (((type*)((mat).data.ptr+row*(mat).step))[4*col+cha])

例一

  1. #include <cv.h>
  2. #include <stdio.h>
  3. #pragma comment( lib, "cv.lib" )
  4. #pragma comment( lib, "cxcore.lib" )
  5. void ecvOutputMatrix(CvMat *mat)
  6. {
  7. for(int i=0;i<mat->rows;i++)
  8. {
  9. for(int j=0;j<mat->cols;j++)
  10. {
  11. int type=cvGetElemType(mat);
  12. switch(type)
  13. {
  14. case CV_8UC1:
  15. printf("%d\t",CV_MAT_ELEM(*mat,uchar,i,j));
  16. break;
  17. case CV_8UC2:
  18. printf("(%d,%d)\t",CV_MAT_ELEM(*mat,uchar,i,j*2),
  19. CV_MAT_ELEM(*mat,uchar,i,j*2+1));
  20. break;
  21. case CV_8UC3:
  22. printf("(%d,%d,%d)\t",CV_MAT_ELEM(*mat,uchar,i,j*3),
  23. CV_MAT_ELEM(*mat,uchar,i,j*3+1),
  24. CV_MAT_ELEM(*mat,uchar,i,j*3+2));
  25. break;
  26. case CV_8UC4:
  27. printf("(%d,%d,%d,%d)\t",CV_MAT_ELEM(*mat,uchar,i,j*4),
  28. CV_MAT_ELEM(*mat,uchar,i,j*4+1),
  29. CV_MAT_ELEM(*mat,uchar,i,j*4+2),
  30. CV_MAT_ELEM(*mat,uchar,i,j*4+3));
  31. break;
  32. case CV_8SC1:
  33. printf("%d\t",CV_MAT_ELEM(*mat,signed char,i,j));
  34. break;
  35. case CV_8SC2:
  36. printf("(%d,%d)\t",CV_MAT_ELEM(*mat,signed char,i,j*2),
  37. CV_MAT_ELEM(*mat,signed char,i,j*2+1));
  38. break;
  39. case CV_8SC3:
  40. printf("(%d,%d,%d)\t",CV_MAT_ELEM(*mat,signed char,i,j*3),
  41. CV_MAT_ELEM(*mat,signed char,i,j*3+1),
  42. CV_MAT_ELEM(*mat,signed char,i,j*3+2));
  43. break;
  44. case CV_8SC4:
  45. printf("(%d,%d,%d,%d)\t",CV_MAT_ELEM(*mat,signed char,i,j*4),
  46. CV_MAT_ELEM(*mat,signed char,i,j*4+1),
  47. CV_MAT_ELEM(*mat,signed char,i,j*4+2),
  48. CV_MAT_ELEM(*mat,signed char,i,j*4+3));
  49. break;
  50. case CV_16UC1:
  51. printf("%d\t",CV_MAT_ELEM(*mat,unsigned short,i,j));
  52. break;
  53. case CV_16UC2:
  54. printf("(%d,%d)\t",CV_MAT_ELEM(*mat,unsigned short,i,j*2),
  55. CV_MAT_ELEM(*mat,unsigned short,i,j*2+1));
  56. break;
  57. case CV_16UC3:
  58. printf("(%d,%d,%d)\t",CV_MAT_ELEM(*mat,unsigned short,i,j*3),
  59. CV_MAT_ELEM(*mat,unsigned short,i,j*3+1),
  60. CV_MAT_ELEM(*mat,unsigned short,i,j*3+2));
  61. break;
  62. case CV_16UC4:
  63. printf("(%d,%d,%d,%d)\t",CV_MAT_ELEM(*mat,unsigned short,i,j*4),
  64. CV_MAT_ELEM(*mat,unsigned short,i,j*4+1),
  65. CV_MAT_ELEM(*mat,unsigned short,i,j*4+2),
  66. CV_MAT_ELEM(*mat,unsigned short,i,j*4+3));
  67. break;
  68. case CV_16SC1:
  69. printf("%d\t",CV_MAT_ELEM(*mat,short,i,j));
  70. break;
  71. case CV_16SC2:
  72. printf("(%d,%d)\t",CV_MAT_ELEM(*mat,short,i,j*2),
  73. CV_MAT_ELEM(*mat,short,i,j*2+1));
  74. break;
  75. case CV_16SC3:
  76. printf("(%d,%d,%d)\t",CV_MAT_ELEM(*mat,short,i,j*3),
  77. CV_MAT_ELEM(*mat,short,i,j*3+1),
  78. CV_MAT_ELEM(*mat,short,i,j*3+2));
  79. break;
  80. case CV_16SC4:
  81. printf("(%d,%d,%d,%d)\t",CV_MAT_ELEM(*mat,short,i,j*4),
  82. CV_MAT_ELEM(*mat,short,i,j*4+1),
  83. CV_MAT_ELEM(*mat,short,i,j*4+2),
  84. CV_MAT_ELEM(*mat,short,i,j*4+3));
  85. break;
  86. case CV_32SC1:
  87. printf("%d\t",CV_MAT_ELEM(*mat,int,i,j));
  88. break;
  89. case CV_32SC2:
  90. printf("(%d,%d)\t",CV_MAT_ELEM(*mat,int,i,j*2),
  91. CV_MAT_ELEM(*mat,int,i,j*2+1));
  92. break;
  93. case CV_32SC3:
  94. printf("(%d,%d,%d)\t",CV_MAT_ELEM(*mat,int,i,j*3),
  95. CV_MAT_ELEM(*mat,int,i,j*3+1),
  96. CV_MAT_ELEM(*mat,int,i,j*3+2));
  97. break;
  98. case CV_32SC4:
  99. printf("(%d,%d,%d,%d)\t",CV_MAT_ELEM(*mat,int,i,j*4),
  100. CV_MAT_ELEM(*mat,int,i,j*4+1),
  101. CV_MAT_ELEM(*mat,int,i,j*4+2),
  102. CV_MAT_ELEM(*mat,int,i,j*4+3));
  103. break;
  104. case CV_32FC1:
  105. printf("%lf\t",CV_MAT_ELEM(*mat,float,i,j));
  106. break;
  107. case CV_32FC2:
  108. printf("(%d,%d)\t",CV_MAT_ELEM(*mat,float,i,j*2),
  109. CV_MAT_ELEM(*mat,float,i,j*2+1));
  110. break;
  111. case CV_32FC3:
  112. printf("(%d,%d,%d)\t",CV_MAT_ELEM(*mat,float,i,j*3),
  113. CV_MAT_ELEM(*mat,float,i,j*3+1),
  114. CV_MAT_ELEM(*mat,float,i,j*3+2));
  115. break;
  116. case CV_32FC4:
  117. printf("(%d,%d,%d,%d)\t",CV_MAT_ELEM(*mat,float,i,j*4),
  118. CV_MAT_ELEM(*mat,float,i,j*4+1),
  119. CV_MAT_ELEM(*mat,float,i,j*4+2),
  120. CV_MAT_ELEM(*mat,float,i,j*4+3));
  121. break;
  122. case CV_64FC1:
  123. printf("%lf\t",CV_MAT_ELEM(*mat,double,i,j));
  124. break;
  125. case CV_64FC2:
  126. printf("(%d,%d)\t",CV_MAT_ELEM(*mat,double,i,j*2),
  127. CV_MAT_ELEM(*mat,double,i,j*2+1));
  128. break;
  129. case CV_64FC3:
  130. printf("(%d,%d,%d)\t",CV_MAT_ELEM(*mat,double,i,j*3),
  131. CV_MAT_ELEM(*mat,double,i,j*3+1),
  132. CV_MAT_ELEM(*mat,double,i,j*3+2));
  133. break;
  134. case CV_64FC4:
  135. printf("(%d,%d,%d,%d)\t",CV_MAT_ELEM(*mat,double,i,j*4),
  136. CV_MAT_ELEM(*mat,double,i,j*4+1),
  137. CV_MAT_ELEM(*mat,double,i,j*4+2),
  138. CV_MAT_ELEM(*mat,double,i,j*4+3));
  139. break;
  140. }
  141. }
  142. putchar('\n');
  143. }
  144. }
  145. int main()
  146. {
  147. int m[]={
  148. 255, 255, 255,
  149. 255, 255, 255,
  150. 128, 200,1
  151. };
  152. CvMat M=cvMat(1,3,CV_32SC3,m);
  153. ecvOutputMatrix(&M);
  154. cvReleaseData(&M);
  155. return 0;
  156. }
例二
  1. #include <cv.h>
  2. #include <stdio.h>
  3. #include <highgui.h>
  4. #pragma comment( lib, "cv.lib" )
  5. #pragma comment( lib, "cxcore.lib" )
  6. #pragma comment( lib, "highgui.lib" )
  7. #define CV_MAT_ELEM_2(mat,type,row,col,cha) (((type*)((mat).data.ptr+row*(mat).step))[2*col+cha])
  8. #define CV_MAT_ELEM_3(mat,type,row,col,cha) (((type*)((mat).data.ptr+row*(mat).step))[3*col+cha])
  9. #define CV_MAT_ELEM_4(mat,type,row,col,cha) (((type*)((mat).data.ptr+row*(mat).step))[4*col+cha])
  10. void ecvOutputMatrix(CvMat *mat)
  11. {
  12. for(int i=0;i<mat->rows;i++)
  13. {
  14. for(int j=0;j<mat->cols;j++)
  15. {
  16. int type=cvGetElemType(mat);
  17. switch(type)
  18. {
  19. case CV_8UC1:
  20. printf("%d\t",CV_MAT_ELEM(*mat,uchar,i,j));
  21. break;
  22. case CV_8UC2:
  23. printf("(%d,%d)\t",CV_MAT_ELEM_2(*mat,uchar,i,j,0),
  24. CV_MAT_ELEM_2(*mat,uchar,i,j,1));
  25. break;
  26. case CV_8UC3:
  27. printf("(%d,%d,%d)\t",CV_MAT_ELEM_3(*mat,uchar,i,j,0),
  28. CV_MAT_ELEM_3(*mat,uchar,i,j,1),
  29. CV_MAT_ELEM_3(*mat,uchar,i,j,2));
  30. break;
  31. case CV_8UC4:
  32. printf("(%d,%d,%d,%d)\t",CV_MAT_ELEM_4(*mat,uchar,i,j,0),
  33. CV_MAT_ELEM_4(*mat,uchar,i,j,1),
  34. CV_MAT_ELEM_4(*mat,uchar,i,j,2),
  35. CV_MAT_ELEM_4(*mat,uchar,i,j,3));
  36. break;
  37. case CV_8SC1:
  38. printf("%d\t",CV_MAT_ELEM(*mat,signed char,i,j));
  39. break;
  40. case CV_8SC2:
  41. printf("(%d,%d)\t",CV_MAT_ELEM_2(*mat,signed char,i,j,0),
  42. CV_MAT_ELEM_2(*mat,signed char,i,j,1));
  43. break;
  44. case CV_8SC3:
  45. printf("(%d,%d,%d)\t",CV_MAT_ELEM_3(*mat,signed char,i,j,0),
  46. CV_MAT_ELEM_3(*mat,signed char,i,j,1),
  47. CV_MAT_ELEM_3(*mat,signed char,i,j,2));
  48. break;
  49. case CV_8SC4:
  50. printf("(%d,%d,%d,%d)\t",CV_MAT_ELEM_4(*mat,signed char,i,j,0),
  51. CV_MAT_ELEM_4(*mat,signed char,i,j,1),
  52. CV_MAT_ELEM_4(*mat,signed char,i,j,2),
  53. CV_MAT_ELEM_4(*mat,signed char,i,j,3));
  54. break;
  55. case CV_16UC1:
  56. printf("%d\t",CV_MAT_ELEM(*mat,unsigned short,i,j));
  57. break;
  58. case CV_16UC2:
  59. printf("(%d,%d)\t",CV_MAT_ELEM_2(*mat,unsigned short,i,j,0),
  60. CV_MAT_ELEM_2(*mat,unsigned short,i,j,1));
  61. break;
  62. case CV_16UC3:
  63. printf("(%d,%d,%d)\t",CV_MAT_ELEM_3(*mat,unsigned short,i,j,0),
  64. CV_MAT_ELEM_3(*mat,unsigned short,i,j,1),
  65. CV_MAT_ELEM_3(*mat,unsigned short,i,j,2));
  66. break;
  67. case CV_16UC4:
  68. printf("(%d,%d,%d,%d)\t",CV_MAT_ELEM_4(*mat,unsigned short,i,j,0),
  69. CV_MAT_ELEM_4(*mat,unsigned short,i,j,1),
  70. CV_MAT_ELEM_4(*mat,unsigned short,i,j,2),
  71. CV_MAT_ELEM_4(*mat,unsigned short,i,j,3));
  72. break;
  73. case CV_16SC1:
  74. printf("%d\t",CV_MAT_ELEM(*mat,short,i,j));
  75. break;
  76. case CV_16SC2:
  77. printf("(%d,%d)\t",CV_MAT_ELEM_2(*mat,short,i,j,0),
  78. CV_MAT_ELEM_2(*mat,short,i,j,1));
  79. break;
  80. case CV_16SC3:
  81. printf("(%d,%d,%d)\t",CV_MAT_ELEM_3(*mat,short,i,j,0),
  82. CV_MAT_ELEM_3(*mat,short,i,j,1),
  83. CV_MAT_ELEM_3(*mat,short,i,j,2));
  84. break;
  85. case CV_16SC4:
  86. printf("(%d,%d,%d,%d)\t",CV_MAT_ELEM_4(*mat,short,i,j,0),
  87. CV_MAT_ELEM_4(*mat,short,i,j,1),
  88. CV_MAT_ELEM_4(*mat,short,i,j,2),
  89. CV_MAT_ELEM_4(*mat,short,i,j,3));
  90. break;
  91. case CV_32SC1:
  92. printf("%d\t",CV_MAT_ELEM(*mat,int,i,j));
  93. break;
  94. case CV_32SC2:
  95. printf("(%d,%d)\t",CV_MAT_ELEM_2(*mat,int,i,j,0),
  96. CV_MAT_ELEM_2(*mat,int,i,j,1));
  97. break;
  98. case CV_32SC3:
  99. printf("(%d,%d,%d)\t",CV_MAT_ELEM_3(*mat,int,i,j,0),
  100. CV_MAT_ELEM_3(*mat,int,i,j,1),
  101. CV_MAT_ELEM_3(*mat,int,i,j,2));
  102. break;
  103. case CV_32SC4:
  104. printf("(%d,%d,%d,%d)\t",CV_MAT_ELEM_4(*mat,int,i,j,0),
  105. CV_MAT_ELEM_4(*mat,int,i,j,1),
  106. CV_MAT_ELEM_4(*mat,int,i,j,2),
  107. CV_MAT_ELEM_4(*mat,int,i,j,3));
  108. break;
  109. case CV_32FC1:
  110. printf("%lf\t",CV_MAT_ELEM(*mat,float,i,j));
  111. break;
  112. case CV_32FC2:
  113. printf("(%d,%d)\t",CV_MAT_ELEM_2(*mat,float,i,j,0),
  114. CV_MAT_ELEM_2(*mat,float,i,j,1));
  115. break;
  116. case CV_32FC3:
  117. printf("(%d,%d,%d)\t",CV_MAT_ELEM_3(*mat,float,i,j,0),
  118. CV_MAT_ELEM_3(*mat,float,i,j,1),
  119. CV_MAT_ELEM_3(*mat,float,i,j,2));
  120. break;
  121. case CV_32FC4:
  122. printf("(%d,%d,%d,%d)\t",CV_MAT_ELEM_4(*mat,float,i,j,0),
  123. CV_MAT_ELEM_4(*mat,float,i,j,1),
  124. CV_MAT_ELEM_4(*mat,float,i,j,2),
  125. CV_MAT_ELEM_4(*mat,float,i,j,3));
  126. break;
  127. case CV_64FC1:
  128. printf("%lf\t",CV_MAT_ELEM(*mat,double,i,j));
  129. break;
  130. case CV_64FC2:
  131. printf("(%d,%d)\t",CV_MAT_ELEM_2(*mat,double,i,j,0),
  132. CV_MAT_ELEM_2(*mat,double,i,j,1));
  133. break;
  134. case CV_64FC3:
  135. printf("(%d,%d,%d)\t",CV_MAT_ELEM_3(*mat,double,i,j,0),
  136. CV_MAT_ELEM_3(*mat,double,i,j,1),
  137. CV_MAT_ELEM_3(*mat,double,i,j,2));
  138. break;
  139. case CV_64FC4:
  140. printf("(%d,%d,%d,%d)\t",CV_MAT_ELEM_4(*mat,double,i,j,0),
  141. CV_MAT_ELEM_4(*mat,double,i,j,1),
  142. CV_MAT_ELEM_4(*mat,double,i,j,2),
  143. CV_MAT_ELEM_4(*mat,double,i,j,3));
  144. break;
  145. }
  146. }
  147. putchar('\n');
  148. }
  149. }
  150. int main()
  151. {
  152. int m[]={
  153. 255, 255, 255,
  154. 255, 255, 255,
  155. 128, 200,1
  156. };
  157. CvMat M=cvMat(1,3,CV_32SC3,m);
  158. ecvOutputMatrix(&M);
  159. cvReleaseData(&M);
  160. IplImage *image=cvLoadImage("lena.jpg",-1);
  161. CvMat mat;
  162. cvGetMat(image,&mat);
  163. ecvOutputMatrix(&mat);
  164. cvReleaseImage(&image);
  165. return 0;
  166. }
Copyright © Linux教程網 All Rights Reserved