cvutUtil.h
上传用户:jiayuled
上传日期:2020-03-04
资源大小:9338k
文件大小:6k
源码类别:

OpenCV

开发平台:

C/C++

  1. #ifndef CVUT_UTIL_H
  2. #define CVUT_UTIL_H
  3. #include "cvutMatrix.h"
  4. #include "cvutImage.h"
  5. #include "cvaux.h"
  6. #include <iostream>
  7. using namespace std;
  8. using namespace cvutMatrix;
  9. using namespace cvutImage;
  10. namespace cvutUtil {
  11. /************************************************************************
  12. image rectification
  13. *************************************************************************/
  14. template <typename T>
  15. void do_morphing(Image<T>& RightImage, Image<T>& LeftImage,CvMatrix3* F_Matrix) {
  16. CvSize ImgSize;
  17. ImgSize.width=RightImage.width*3;
  18. ImgSize.height=RightImage.height*3;
  19. int line_count;
  20. cvMakeScanlines(0,ImgSize,0,0,0,0,&line_count);
  21. line_count=2400;
  22. int* scanlines1;
  23. int* scanlines2;
  24. int* scanlinesA;
  25. scanlines1=(int*)(calloc( line_count * 2, sizeof(int) * 4));
  26. scanlines2=(int*)(calloc( line_count * 2, sizeof(int) * 4));
  27. scanlinesA=(int*)(calloc( line_count * 2, sizeof(int) * 4));
  28. int* lenghts1;
  29. int* lenghts2;
  30. int* lenghts;
  31. lenghts1=(int*)(calloc( line_count * 2, sizeof(int)*4));
  32. lenghts2=(int*)(calloc( line_count * 2, sizeof(int)*4));
  33. lenghts=(int*)(calloc( line_count * 2, sizeof(int)*4));
  34. // IplImage* dst1 = cvCreateImage(cvSize(ImgSize.width,ImgSize.height),8,3);
  35. // IplImage* dst2 = cvCreateImage(cvSize(ImgSize.width,ImgSize.height),8,3);
  36. // IplImage* dst3 = cvCreateImage(cvSize(ImgSize.width,ImgSize.height),8,3);
  37. uchar* dst1;
  38. dst1=(uchar*)(malloc(ImgSize.width * (ImgSize.height+1) * 3 * sizeof(uchar)));
  39. uchar* dst2;
  40. dst2=(uchar*)(malloc(ImgSize.width * (ImgSize.height+1) * 3 * sizeof(uchar)));
  41. uchar* dst_pix;
  42. dst_pix=(uchar*)(calloc(ImgSize.width * (ImgSize.height+1), 3 * sizeof(uchar)));
  43. int* runs1;
  44. int* runs2;
  45. runs1=(int*)(calloc(ImgSize.width * ImgSize.height * 2, 2 * sizeof(int)));
  46. runs2=(int*)(calloc(ImgSize.width * ImgSize.height * 2, 2 * sizeof(int)));
  47. int* first_corr;
  48. int* second_corr;
  49. first_corr=(int*)(calloc(ImgSize.width * ImgSize.height * 2, 2 * sizeof(int)));
  50. second_corr=(int*)(calloc(ImgSize.width * ImgSize.height * 2, 2 * sizeof(int)));
  51. int* num_runs1;
  52. int* num_runs2;
  53. num_runs1=(int*)(calloc(ImgSize.width * ImgSize.height * 2, 2 * sizeof(int)));
  54. num_runs2=(int*)(calloc(ImgSize.width * ImgSize.height * 2, 2 * sizeof(int)));
  55. ImgSize.width=RightImage.width;
  56. ImgSize.height=RightImage.height;
  57. cvMakeScanlines(F_Matrix,ImgSize,0,0,0,0,&line_count);
  58. cvMakeScanlines(F_Matrix,ImgSize,scanlines1,scanlines2,lenghts1,lenghts2,&line_count);
  59. //  IplImage* image1=cvCreateImage(RightImage.size(),8,3);
  60. //  image1=cvCloneImage(RightImage.cvimage);
  61. // cvPreWarpImage(line_count,image1,dst1,lenghts1,scanlines1);
  62. cvPreWarpImage(line_count,RightImage.cvimage,dst1,lenghts1,scanlines1);
  63. //  IplImage* image2=cvCreateImage(LeftImage.size(),8,3);
  64. //  image2=cvCloneImage(LeftImage.cvimage);
  65. // cvPreWarpImage(line_count,image2,dst2,lenghts2,scanlines2);
  66. cvPreWarpImage(line_count,LeftImage.cvimage,dst2,lenghts2,scanlines2);
  67. if (scanlines1 != 0) free (scanlines1);
  68. if (scanlines2 != 0) free (scanlines2);
  69. if (scanlinesA != 0) free (scanlinesA);
  70. if (lenghts1 != 0) free (lenghts1);
  71. if (lenghts2 != 0) free (lenghts2);
  72. if (lenghts != 0) free (lenghts);
  73. if (dst1 != 0) free (dst1);
  74. if (dst2 != 0) free (dst2);
  75. if (dst_pix != 0) free (dst_pix);
  76. if (runs1 != 0) free (runs1);
  77. if (runs2 != 0) free (runs2);
  78. if (first_corr != 0) free (first_corr);
  79. if (second_corr != 0) free (second_corr);
  80. if (num_runs1 != 0) free (num_runs1);
  81. if (num_runs2 != 0) free (num_runs2);
  82. scanlines1 = 0;
  83. scanlines2 = 0;
  84. scanlinesA = 0;
  85. lenghts1 = 0;
  86. lenghts2 = 0;
  87. lenghts = 0;
  88. runs1 = 0;
  89. runs2 = 0;
  90. dst1 = 0;
  91. dst2 = 0;
  92. dst_pix = 0;
  93. num_runs1 = 0;
  94. num_runs2 = 0;
  95. first_corr = 0;
  96. second_corr = 0;
  97. };
  98. /************************************************************************
  99. calculate the skew symmetric matrix of a vector
  100. *************************************************************************/
  101. template <typename T>
  102. Matrix<T> skew_sym(Matrix<T>& vec) {
  103. if (!(vec.channels == 1 && 
  104. (vec.rows == 3 && vec.cols == 1 || vec.rows == 1 && vec.cols == 3)))
  105. {
  106. cerr<<"wrong type of matrix!n";
  107. exit(1);
  108. }
  109. Matrix<T> skew(3,3,1);
  110. skew(0,1) = -vec.data[2];
  111. skew(0,2) = vec.data[1];
  112. skew(1,0) = vec.data[2];
  113. skew(1,2) = -vec.data[0];
  114. skew(2,0) = -vec.data[1];
  115. skew(2,1) = vec.data[0];
  116. return skew;
  117. };
  118. /************************************************************************
  119. calculate fundamental matrix using two projective matrixes
  120. *************************************************************************/
  121. template <typename T>
  122. Matrix<T> calc_fundamental(Matrix<T>& mat1, Matrix<T>& mat2) {
  123. if (mat1.rows != 3 || mat1.cols != 4 || mat1.channels != 1
  124. || mat2.rows != 3 || mat2.cols != 4 || mat2.channels != 1) 
  125. {
  126. cerr<<"wrong type of matrix!n";
  127. exit(1);
  128. }
  129. return skew_sym(mat2.get_col(3)-mat2.get_cols(0,2)*invert(mat1.get_cols(0,2))*mat1.get_col(3))*mat2.get_cols(0,2)*invert(mat1.get_cols(0,2));
  130. };
  131. /***********************************************************************
  132. histgram equalization
  133. ***********************************************************************/
  134. template <typename T>
  135. void hist_equalize(Image<T>& src) {
  136. if (src.channels > 1) {
  137. cerr<<"fail to equalize histgram!n";
  138. exit(1);
  139. }
  140. int hdim = 256;    // bin of HIST, default = 256
  141. CvHistogram *hist = 0;
  142. int n = hdim;     
  143. double* nn = new double[hdim];
  144. uchar* T = new uchar[hdim];
  145. int sum = 0; // sum of pixels of the source image 图像中象素点的总和
  146. double val = 0;
  147. // calculate histgram 计算直方图
  148. hist = cvCreateHist( 1, &n, CV_HIST_ARRAY, 0, 1 );  
  149. cvCalcHist( &src.cvimage, hist, 0, 0 ); 
  150. // Create Accumulative Distribute Function of histgram
  151. int i;
  152. for (i = 0; i < n; i++)
  153. {
  154. val = val + cvGetReal1D (hist->bins, i);
  155. nn[i] = val;
  156. }
  157. // Compute intensity transformation 计算变换函数的离散形式
  158. sum = src.height * src.width;
  159. for(i = 0; i < n; i++ )
  160. {
  161. T[i] = (uchar) (255 * nn[i] / sum); // range is [0,255]
  162. }
  163. Matrix<uchar> T_mat(1,256,1,T);
  164. cvLUT( src.cvimage, src.cvimage, T_mat.cvmat ); 
  165. };
  166. } /* namespace cvutUtil */
  167. #endif