/externals/pix_opencv/pix_opencv_hu_moments.cc

https://github.com/pd-l2ork/pd · C++ · 207 lines · 121 code · 39 blank · 47 comment · 8 complexity · 06e1b0bf04046ba1e77984738e8485c9 MD5 · raw file

  1. ////////////////////////////////////////////////////////
  2. //
  3. // GEM - Graphics Environment for Multimedia
  4. //
  5. // zmoelnig@iem.kug.ac.at
  6. //
  7. // Implementation file
  8. //
  9. // Copyright (c) 1997-2000 Mark Danks.
  10. // Copyright (c) Günther Geiger.
  11. // Copyright (c) 2001-2002 IOhannes m zmoelnig. forum::für::umläute. IEM
  12. // Copyright (c) 2002 James Tittle & Chris Clepper
  13. // For information on usage and redistribution, and for a DISCLAIMER OF ALL
  14. // WARRANTIES, see the file, "GEM.LICENSE.TERMS" in this distribution.
  15. //
  16. /////////////////////////////////////////////////////////
  17. #include "pix_opencv_hu_moments.h"
  18. CPPEXTERN_NEW(pix_opencv_hu_moments)
  19. /////////////////////////////////////////////////////////
  20. //
  21. // pix_opencv_hu_moments
  22. //
  23. /////////////////////////////////////////////////////////
  24. // Constructor
  25. //
  26. /////////////////////////////////////////////////////////
  27. pix_opencv_hu_moments :: pix_opencv_hu_moments()
  28. {
  29. m_dataout = outlet_new(this->x_obj, &s_anything);
  30. comp_xsize = 320;
  31. comp_ysize = 240;
  32. x_binary = 0;
  33. rgba = cvCreateImage(cvSize(comp_xsize,comp_ysize), IPL_DEPTH_8U, 4);
  34. rgb = cvCreateImage(cvSize(comp_xsize,comp_ysize), IPL_DEPTH_8U, 3);
  35. gray = cvCreateImage(cvSize(comp_xsize,comp_ysize), IPL_DEPTH_8U, 1);
  36. }
  37. /////////////////////////////////////////////////////////
  38. // Destructor
  39. //
  40. /////////////////////////////////////////////////////////
  41. pix_opencv_hu_moments :: ~pix_opencv_hu_moments()
  42. {
  43. //Destroy cv_images to clean memory
  44. cvReleaseImage(&rgba);
  45. cvReleaseImage(&rgb);
  46. cvReleaseImage(&gray);
  47. }
  48. /////////////////////////////////////////////////////////
  49. // processImage
  50. //
  51. /////////////////////////////////////////////////////////
  52. void pix_opencv_hu_moments :: processRGBAImage(imageStruct &image)
  53. {
  54. if ((this->comp_xsize!=image.xsize)||(this->comp_ysize!=image.ysize)||(!rgba))
  55. {
  56. this->comp_xsize = image.xsize;
  57. this->comp_ysize = image.ysize;
  58. //Destroy cv_images to clean memory
  59. if ( rgba )
  60. {
  61. cvReleaseImage(&rgba);
  62. cvReleaseImage(&rgb);
  63. cvReleaseImage(&gray);
  64. }
  65. //create the orig image with new size
  66. rgba = cvCreateImage(cvSize(image.xsize,image.ysize), IPL_DEPTH_8U, 4);
  67. rgb = cvCreateImage(cvSize(image.xsize,image.ysize), IPL_DEPTH_8U, 3);
  68. gray = cvCreateImage(cvSize(image.xsize,image.ysize), IPL_DEPTH_8U, 1);
  69. }
  70. memcpy( rgba->imageData, image.data, image.xsize*image.ysize*4 );
  71. cvCvtColor(rgba, gray, CV_BGRA2GRAY);
  72. cvMoments( gray, &x_moments, x_binary );
  73. cvGetHuMoments( &x_moments, &x_humoments );
  74. SETFLOAT(&rlist[0], x_humoments.hu1);
  75. SETFLOAT(&rlist[1], x_humoments.hu2);
  76. SETFLOAT(&rlist[2], x_humoments.hu3);
  77. SETFLOAT(&rlist[3], x_humoments.hu4);
  78. SETFLOAT(&rlist[4], x_humoments.hu5);
  79. SETFLOAT(&rlist[5], x_humoments.hu6);
  80. SETFLOAT(&rlist[6], x_humoments.hu7);
  81. outlet_list( m_dataout, 0, 7, rlist );
  82. }
  83. void pix_opencv_hu_moments :: processRGBImage(imageStruct &image)
  84. {
  85. unsigned char *pixels = image.data;
  86. if ((this->comp_xsize!=image.xsize)||(this->comp_ysize!=image.ysize)||(!rgb)) {
  87. this->comp_xsize = image.xsize;
  88. this->comp_ysize = image.ysize;
  89. //Destroy cv_images to clean memory
  90. if ( rgb )
  91. {
  92. cvReleaseImage(&rgba);
  93. cvReleaseImage(&rgb);
  94. cvReleaseImage(&gray);
  95. }
  96. //create the orig image with new size
  97. rgba = cvCreateImage(cvSize(image.xsize,image.ysize), IPL_DEPTH_8U, 4);
  98. rgb = cvCreateImage(cvSize(image.xsize,image.ysize), IPL_DEPTH_8U, 3);
  99. gray = cvCreateImage(cvSize(rgb->width,rgb->height), IPL_DEPTH_8U, 1);
  100. }
  101. memcpy( rgb->imageData, image.data, image.xsize*image.ysize*3 );
  102. cvCvtColor(rgb, gray, CV_RGB2GRAY);
  103. cvMoments( gray, &x_moments, x_binary );
  104. cvGetHuMoments( &x_moments, &x_humoments );
  105. SETFLOAT(&rlist[0], x_humoments.hu1);
  106. SETFLOAT(&rlist[1], x_humoments.hu2);
  107. SETFLOAT(&rlist[2], x_humoments.hu3);
  108. SETFLOAT(&rlist[3], x_humoments.hu4);
  109. SETFLOAT(&rlist[4], x_humoments.hu5);
  110. SETFLOAT(&rlist[5], x_humoments.hu6);
  111. SETFLOAT(&rlist[6], x_humoments.hu7);
  112. outlet_list( m_dataout, 0, 7, rlist );
  113. }
  114. void pix_opencv_hu_moments :: processYUVImage(imageStruct &image)
  115. {
  116. post( "pix_opencv_hu_moments : yuv format not supported" );
  117. }
  118. void pix_opencv_hu_moments :: processGrayImage(imageStruct &image)
  119. {
  120. unsigned char *pixels = image.data;
  121. if ((this->comp_xsize!=image.xsize)||(this->comp_ysize!=image.ysize)||(!rgb)) {
  122. this->comp_xsize = image.xsize;
  123. this->comp_ysize = image.ysize;
  124. //Destroy cv_images to clean memory
  125. if ( rgb )
  126. {
  127. cvReleaseImage(&rgba);
  128. cvReleaseImage(&rgb);
  129. cvReleaseImage(&gray);
  130. }
  131. //create the orig image with new size
  132. rgba = cvCreateImage(cvSize(image.xsize,image.ysize), IPL_DEPTH_8U, 4);
  133. rgb = cvCreateImage(cvSize(image.xsize,image.ysize), IPL_DEPTH_8U, 3);
  134. gray = cvCreateImage(cvSize(rgb->width,rgb->height), IPL_DEPTH_8U, 1);
  135. }
  136. memcpy( gray->imageData, image.data, image.xsize*image.ysize );
  137. cvMoments( gray, &x_moments, x_binary );
  138. cvGetHuMoments( &x_moments, &x_humoments );
  139. SETFLOAT(&rlist[0], x_humoments.hu1);
  140. SETFLOAT(&rlist[1], x_humoments.hu2);
  141. SETFLOAT(&rlist[2], x_humoments.hu3);
  142. SETFLOAT(&rlist[3], x_humoments.hu4);
  143. SETFLOAT(&rlist[4], x_humoments.hu5);
  144. SETFLOAT(&rlist[5], x_humoments.hu6);
  145. SETFLOAT(&rlist[6], x_humoments.hu7);
  146. outlet_list( m_dataout, 0, 7, rlist );
  147. }
  148. /////////////////////////////////////////////////////////
  149. // floatThreshMess
  150. //
  151. /////////////////////////////////////////////////////////
  152. void pix_opencv_hu_moments :: floatBinaryMess (float binary)
  153. {
  154. if ( ((int)binary==1) || ((int)binary==0) ) x_binary = (int)binary;
  155. }
  156. /////////////////////////////////////////////////////////
  157. // static member function
  158. //
  159. /////////////////////////////////////////////////////////
  160. void pix_opencv_hu_moments :: obj_setupCallback(t_class *classPtr)
  161. {
  162. class_addmethod(classPtr, (t_method)&pix_opencv_hu_moments::floatBinaryMessCallback,
  163. gensym("binary"), A_FLOAT, A_NULL);
  164. }
  165. void pix_opencv_hu_moments :: floatBinaryMessCallback(void *data, t_floatarg binary)
  166. {
  167. GetMyClass(data)->floatBinaryMess((float)binary);
  168. }