/result/FDDB_evaluation/evaluation/OpenCVUtils.cpp

https://github.com/foreverYoungGitHub/CascadeCNN · C++ · 208 lines · 157 code · 33 blank · 18 comment · 22 complexity · 0bcabd5b0f20f43a2aad67d9b99ef078 MD5 · raw file

  1. #ifndef __OPENCVUTILS_HPP__
  2. #define __OPENCVUTILS_HPP__
  3. #include "OpenCVUtils.hpp"
  4. using namespace std;
  5. void matPrint(string s, const CvArr *M){
  6. assert(M != NULL);
  7. if(!s.empty())
  8. cerr << s;
  9. CvTypeInfo *info = cvTypeOf(M);
  10. if(!strcmp(info->type_name, CV_TYPE_NAME_IMAGE)){
  11. CvScalar s;
  12. IplImage *I = (IplImage *)M;
  13. for(int i=0; i< I->height; i++){
  14. for(int j=0; j< I->width; j++){
  15. s = cvGet2D(I,i,j);
  16. cerr << s.val[0] << " ";
  17. }
  18. cerr << endl;
  19. }
  20. }else if(!strcmp(info->type_name, CV_TYPE_NAME_MAT)){
  21. CvMat *M1 = (CvMat *)M;
  22. for(int i=0; i< M1->height; i++){
  23. for(int j=0; j< M1->width; j++)
  24. cerr << cvmGet(M1, i, j) << " ";
  25. cerr << endl;
  26. }
  27. }else{
  28. assert(false);
  29. }
  30. }
  31. void matRotate(const CvArr * src, CvArr * dst, double angle){
  32. float m[6];
  33. //double factor = (cos(angle*CV_PI/180.) + 1.1)*3;
  34. double factor = 1;
  35. CvMat M = cvMat( 2, 3, CV_32F, m );
  36. int w = ((CvMat *)src)->width;
  37. int h = ((CvMat *)src)->height;
  38. m[0] = (float)(factor*cos(-angle*CV_PI/180.));
  39. m[1] = (float)(factor*sin(-angle*CV_PI/180.));
  40. m[2] = (w-1)*0.5f;
  41. m[3] = -m[1];
  42. m[4] = m[0];
  43. m[5] = (h-1)*0.5f;
  44. cvGetQuadrangleSubPix( src, dst, &M);
  45. }
  46. void matCopyStuffed(const CvArr *src, CvArr *dst){
  47. // TODO: get a flag for default value
  48. //double tMin, tMax;
  49. //cvMinMaxLoc(src, &tMin, &tMax);
  50. cvSet(dst, cvScalar(0));
  51. CvMat *SMat = (CvMat *)src;
  52. CvMat *DMat = (CvMat *)dst;
  53. int sRow, dRow, sCol, dCol;
  54. if(SMat->rows >= DMat->rows){
  55. sRow = (SMat->rows - DMat->rows)/2;
  56. dRow = 0;
  57. }else{
  58. sRow = 0;
  59. dRow = (DMat->rows - SMat->rows)/2;
  60. }
  61. if(SMat->cols >= DMat->cols){
  62. sCol = (SMat->cols - DMat->cols)/2;
  63. dCol = 0;
  64. }else{
  65. sCol = 0;
  66. dCol = (DMat->cols - SMat->cols)/2;
  67. }
  68. //cerr << "src start " << sRow << " " << sCol << " dst " << dRow << " " << dCol << endl;
  69. /*
  70. for(int di =0; di < dRow; di++)
  71. for(int dj = 0; (dj < DMat->cols) && (dj < SMat->cols) ; dj++)
  72. cvmSet(DMat, di, dj, cvmGet(SMat, sRow, dj));
  73. for(int dj =0; dj < dCol; dj++)
  74. for(int di = 0; (di < DMat->rows) && (di < SMat->rows) ; di++)
  75. cvmSet(DMat, di, dj, cvmGet(SMat, di, sCol));
  76. */
  77. for( int si = sRow, di = dRow ; (si<SMat->rows && di<DMat->rows); si++, di++)
  78. for( int sj = sCol, dj = dCol ; (sj<SMat->cols && dj<DMat->cols); sj++, dj++)
  79. cvmSet(DMat, di, dj, cvmGet(SMat, si, sj));
  80. }
  81. void matNormalize(const CvArr * src, CvArr *dst, double minVal, double maxVal){
  82. double tMin, tMax;
  83. cvMinMaxLoc(src, &tMin, &tMax);
  84. double scaleFactor = (maxVal-minVal)/(tMax-tMin);
  85. cvSubS(src, cvScalar(tMin), dst);
  86. cvConvertScale(dst, dst, scaleFactor, minVal);
  87. }
  88. double matMedian(const CvArr *M){
  89. int starti=0, startj=0, height, width;
  90. CvTypeInfo *info = cvTypeOf(M);
  91. if(!strcmp(info->type_name, CV_TYPE_NAME_IMAGE)){
  92. CvRect r = cvGetImageROI((IplImage *)M);
  93. height = r.height;
  94. width = r.width;
  95. startj = r.x;
  96. starti = r.y;
  97. }else if(!strcmp(info->type_name, CV_TYPE_NAME_MAT)){
  98. height = ((CvMat *)M)->height;
  99. width = ((CvMat *)M)->width;
  100. }else{
  101. assert(false);
  102. }
  103. // push elements into a vector
  104. vector<double> v;
  105. for(int i=0; i< height; i++)
  106. for(int j=0; j<width; j++){
  107. v.push_back(cvGet2D(M,i,j).val[0]);
  108. }
  109. // sort the vector and return the median element
  110. sort(v.begin(), v.end());
  111. return *(v.begin() + v.size()/2);
  112. }
  113. void showImage(string title, const CvArr *M){
  114. const char *s = title.c_str();
  115. cvNamedWindow(s, 0);
  116. cvMoveWindow(s, 100, 400);
  117. cvShowImage(s, M);
  118. cvWaitKey(0);
  119. cvDestroyWindow(s);
  120. }
  121. // like imagesc
  122. void showImageSc(string title, const CvArr *M, int height, int width){
  123. const char *s = title.c_str();
  124. IplImage *I1;
  125. CvTypeInfo *info = cvTypeOf(M);
  126. if(!strcmp(info->type_name, CV_TYPE_NAME_IMAGE)){
  127. I1 = (IplImage *)M;
  128. }else if(!strcmp(info->type_name, CV_TYPE_NAME_MAT)){
  129. CvMat *M2 = cvCloneMat((CvMat *)M);
  130. matNormalize(M, M2, 0, 255);
  131. double tMin, tMax;
  132. cvMinMaxLoc(M2, &tMin, &tMax);
  133. I1 = cvCreateImage(cvGetSize(M2), IPL_DEPTH_8U,1);
  134. cvConvertScale(M2, I1);
  135. }else{
  136. assert(false);
  137. }
  138. IplImage *I = cvCreateImage(cvSize(height, width), I1->depth,1);
  139. cvResize(I1, I);
  140. cvNamedWindow(s, 0);
  141. cvMoveWindow(s, 100, 400);
  142. cvShowImage(s, I);
  143. cvWaitKey(0);
  144. cvDestroyWindow(s);
  145. cvReleaseImage(&I);
  146. cvReleaseImage(&I1);
  147. }
  148. IplImage *readImage(const char *fileName, int useColorImage){
  149. #ifdef _WIN32
  150. IplImage *img = cvLoadImage(fileName, useColorImage);
  151. #else
  152. // check the extension for jpg files; OpenCV has issues with reading jpg files.
  153. int randInt = rand();
  154. char randIntStr[128];
  155. sprintf(randIntStr, "%d", randInt);
  156. string tmpPPMFile("cacheReadImage");
  157. tmpPPMFile += randIntStr;
  158. tmpPPMFile += ".ppm";
  159. string sysCommand = "convert ";
  160. sysCommand += fileName;
  161. sysCommand += " " + tmpPPMFile;
  162. system(sysCommand.c_str());
  163. IplImage *img = cvLoadImage(tmpPPMFile.c_str(), useColorImage);
  164. if(img == NULL)
  165. {
  166. cerr << " Could not read image" << endl;
  167. }
  168. sysCommand = "rm -f ";
  169. sysCommand += tmpPPMFile;
  170. system(sysCommand.c_str());
  171. #endif
  172. return img;
  173. }
  174. #endif