cvmat.c
上传用户:banwdc
上传日期:2016-06-25
资源大小:2871k
文件大小:6k
源码类别:

OpenCV

开发平台:

Visual C++

  1. /* 程序名:cvmat.c
  2.    功能:说明矩阵的一些操作方法
  3. */
  4. #include "cv.h"
  5. #include "highgui.h"
  6. #include <stdio.h>
  7. void PrintMat(CvMat *A);  // 显示矩阵
  8. void GenRandn(CvMat *arr, int seed); // 生成正态分布的随机矩阵
  9. void GenRand(CvMat *arr, int seed); // 生成[0,1]均匀分布的随机矩阵
  10. static int cmp_func( const void* _a, const void* _b, void* userdata ); // 比较函数
  11. void Test_Multiply();  // 测试矩阵乘法
  12. void Test_cvGetRawData();  // 将缓存数据填入CvMat数组中
  13. void Test_DCT();   // 计算DCT变换
  14. void Test_Rand();  // 生成随机数
  15. void Test_SeqSort();  // 二维序列排序
  16. int main()
  17. {
  18.     Test_Multiply();        // pass
  19.     Test_cvGetRawData();    // pass
  20.     Test_DCT();             //pass
  21. Test_Rand();     // pass
  22. Test_SeqSort();  // pass
  23.     return 0;
  24. }
  25. // Testing: Sort 2d points in top-to-bottom left-to-right order.
  26. void Test_SeqSort()
  27. {
  28. CvMemStorage* storage = cvCreateMemStorage(0);
  29. CvSeq* seq = cvCreateSeq( CV_32SC2, sizeof(CvSeq), sizeof(CvPoint), storage );
  30. int i;
  31.     printf("n=== Test sequence sorting ===");
  32.     for( i = 0; i < 10; i++ )
  33. {
  34. CvPoint pt;
  35. pt.x = rand() % 1000;  // 1000 以内的随机数
  36. pt.y = rand() % 1000;
  37. cvSeqPush( seq, &pt );
  38. }
  39. printf("nOriginal point set:n");
  40. for( i = 0; i < seq->total; i++ )
  41. {
  42. CvPoint* pt = (CvPoint*)cvGetSeqElem( seq, i );
  43. printf( "(%d,%d)n", pt->x, pt->y );
  44. }
  45. cvSeqSort( seq, cmp_func, 0 /* userdata is not used here */ );
  46. /* print out the sorted sequence */
  47. printf("nAfter sorting:n");
  48. for( i = 0; i < seq->total; i++ )
  49. {
  50. CvPoint* pt = (CvPoint*)cvGetSeqElem( seq, i );
  51. printf( "(%d,%d)n", pt->x, pt->y );
  52. }
  53. cvClearSeq( seq );   // Sequence clearing should be done before storage clearing
  54. cvReleaseMemStorage( &storage );
  55. }
  56. // The comparison function that returns negative, zero
  57. // or positive value depending on the elements relation 
  58. static int cmp_func( const void* _a, const void* _b, void* userdata )
  59. {
  60.     CvPoint* a = (CvPoint*)_a;
  61.     CvPoint* b = (CvPoint*)_b;
  62.     int y_diff = a->y - b->y;
  63.     int x_diff = a->x - b->x;
  64.     return y_diff ? y_diff : x_diff;
  65. }
  66. // 生成随机矩阵
  67. void Test_Rand()
  68. {
  69.     CvMat* a = cvCreateMat( 10, 6, CV_32F );
  70.     int i;
  71.     printf("n=== Test generating random matrix ===");
  72.     for(i=0;i<5;i++)
  73.     {
  74.         GenRandn(a, i);
  75.         PrintMat(a);
  76.     }
  77.     cvReleaseMat(&a);
  78. }
  79. // 显示矩阵
  80. void PrintMat(CvMat* A)
  81. {
  82.     int i,j;
  83.     //printf("nMatrix = :");
  84.     for(i=0;i<A->rows;i++)
  85.     {
  86.         printf("n");
  87.         
  88.         switch( CV_MAT_DEPTH(A->type) )
  89.         {
  90.         case CV_32F:
  91.         case CV_64F:
  92.             for(j=0;j<A->cols;j++)
  93.                 printf("%9.3f ", (float) cvGetReal2D( A, i, j ));
  94.             break;
  95.         case CV_8U:
  96.         case CV_16U:
  97.             for(j=0;j<A->cols;j++)
  98.                 printf("%6d",(int)cvGetReal2D( A, i, j ));
  99.             break;
  100.         default:
  101.             break;
  102.         }
  103.     }
  104.     printf("n");
  105. }
  106. /*
  107. Generate uniformly distributed random numbers.
  108. Fill random numbers to arr, chosen from 
  109. a uniform distribution on the interval (0.0,1.0).
  110. seed is the random generator seed. 
  111. Array arr should be pre-allocated before calling this function
  112. */
  113. void GenRand(CvMat* arr, int seed)
  114. {
  115.     // let's noisy_screen be the floating-point 2d array that is to be "crapped" 
  116.     CvRandState rng;
  117.     
  118.     // initialize random generator
  119.     rng.state = cvRNG(0xffffffff);
  120. cvRandInit( &rng,
  121.         0, 1,      // use dummy parameters now and adjust them further 
  122.         seed, // use input seed here 
  123.         CV_RAND_UNI // specify uniform type  
  124.         );
  125.     
  126.     cvRandArr( &rng.state, arr, CV_RAND_UNI, cvRealScalar(0), cvRealScalar(1) );
  127.     // RNG state does not need to be deallocated 
  128. }
  129. /*
  130. Generate normally distributed random numbers.
  131. Fill random numbers to arr, of a normal distribution 
  132. with mean zero and variance one.
  133. seed is the random generator seed. 
  134. Array arr should be pre-allocated before calling this function
  135. */
  136. void GenRandn(CvMat* arr, int seed)
  137. {
  138.     // let's noisy_screen be the floating-point 2d array that is to be "crapped" 
  139.     CvRandState rng;
  140.     
  141.     // modify RNG to make it produce normally distributed values
  142.     rng.state = cvRNG(0xffffffff);
  143.     cvRandInit( &rng,
  144.         0, 1,      // use dummy parameters now and adjust them further 
  145.         seed, // use input seed here 
  146.         CV_RAND_NORMAL // specify uniform type  
  147.         );
  148.     // fill random numbers to arr, with mean zero and variance one  
  149.     cvRandArr( &rng.state, arr, CV_RAND_NORMAL,
  150.         cvRealScalar(0),  // average intensity
  151.         cvRealScalar(1)   // deviation of the intensity
  152.         );
  153.     // RNG state does not need to be deallocated 
  154. }
  155. // Test matrix multiply
  156. void Test_Multiply()
  157. {
  158.     double a[] = { 1,  2,  3,  4,
  159. 5,  6,  7,  8,
  160. 9, 10,  11, 12 };
  161.     
  162.     double b[] = {  1, 5, 9,
  163. 2, 6, 10,
  164. 3, 7, 11,
  165. 4, 8, 12 };
  166.     
  167.     double c[9];
  168.     CvMat Ma, Mb, Mc;
  169.     
  170.     printf("n=== Test multiply ===");
  171.     cvInitMatHeader( &Ma, 3, 4, CV_64FC1, a, CV_AUTOSTEP );
  172.     cvInitMatHeader( &Mb, 4, 3, CV_64FC1, b, CV_AUTOSTEP );
  173.     cvInitMatHeader( &Mc, 3, 3, CV_64FC1, c, CV_AUTOSTEP );
  174.     cvMatMulAdd( &Ma, &Mb, 0, &Mc );
  175.     
  176.     PrintMat(&Ma);
  177.     PrintMat(&Mb);
  178.     PrintMat(&Mc);
  179.     return;
  180. }
  181. // Get raw data from data buffer and pass them to a matrix
  182. void Test_cvGetRawData()
  183. {
  184.     float* data;
  185.     int step;
  186.     float a[] = {  1, 2, 3, 4,
  187.  -5, 6, 7, 8,
  188.  9, -10, -11, 12 };
  189.     CvMat array;
  190.     CvSize size;
  191.     int x, y;
  192.     
  193.     printf("n=== Test get raw data ===");
  194.     cvInitMatHeader( &array, 3, 4, CV_32FC1, a, CV_AUTOSTEP );
  195.     
  196.     cvGetRawData( &array, (uchar**)&data, &step, &size );
  197.     step /= sizeof(data[0]);
  198.     
  199.     printf("nCvMat = ");
  200.     PrintMat(&array);
  201.     printf("nData = ");
  202.     for( y = 0; y < size.height; y++, data += step )
  203.     {
  204.         printf("n");
  205.         for( x = 0; x < size.width; x++ )
  206.         {
  207.             data[x] = (float)fabs(data[x]);
  208.             printf("%8.2f",data[x]);
  209.         }
  210.     }
  211.     printf("n");
  212.     return;
  213. }
  214. // test 1-d and 2-d dct transform
  215. void Test_DCT()
  216. {
  217.     float data[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
  218.     
  219.     CvMat a;
  220.     a = cvMat(2,4,CV_32FC1,data);
  221.     printf("n=== Test DCT ===");
  222.     printf("nOriginal matrix = "); PrintMat(&a);
  223.     
  224.     cvDCT(&a, &a, CV_DXT_FORWARD);
  225.     printf("n2-D DCT = "); PrintMat(&a);
  226.     cvDCT(&a, &a, CV_DXT_INVERSE);
  227.     printf("n2-D IDCT = "); PrintMat(&a);
  228. }