OpenCV计算重心坐标

来源:互联网 发布:龙华民治数据 编辑:程序博客网 时间:2024/06/11 01:20

原文地址:http://blog.csdn.net/wangyaninglm/article/details/49618769

效果图:


代码:


[cpp] view plain copy print?
  1. // FindGravity.cpp : 定义控制台应用程序的入口点。  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5. #include <iostream>  
  6. #include <string>  
  7. #include "cv.h"   
  8. #include "highgui.h"   
  9.   
  10.   
  11.   
  12.   
  13. #include <opencv2/core/core.hpp>    
  14. #include <opencv2/highgui/highgui.hpp>  
  15.   
  16.   
  17. #pragma comment(lib,"opencv_core2410d.lib")                  
  18. #pragma comment(lib,"opencv_highgui2410d.lib")                  
  19. #pragma comment(lib,"opencv_imgproc2410d.lib")     
  20.   
  21. using namespace std;  
  22. using namespace cv;  
  23.   
  24.   
  25. void FindGravity()  
  26. {  
  27.       
  28. }  
  29. /** 计算二值图像的重心 
  30. * @param[in] src  输入的待处理图像 
  31. * @param[out] center 重心坐标 
  32. * @retval 0  操作成功 
  33. * @retval -1 操作失败 
  34. * @note 输入图像是二值化图像 
  35. * @note xc=M10/M00, yc=M01/M00, 其中 Mx_order,y_order=SUMx,y(I(x,y)*x^x_order*y^y_order) 
  36.  */  
  37.  static int aoiGravityCenter(IplImage *src, CvPoint ¢er)  
  38.  {  
  39.   //if(!src)  
  40.   // return GRAVITYCENTER__SRC_IS_NULL;  
  41.   double m00, m10, m01;  
  42.   CvMoments moment;  
  43.   cvMoments( src, &moment, 1);  
  44.   m00 = cvGetSpatialMoment( &moment, 0, 0 );  
  45.   if( m00 == 0)   
  46.    return 1;  
  47.   m10 = cvGetSpatialMoment( &moment, 1, 0 );  
  48.   m01 = cvGetSpatialMoment( &moment, 0, 1 );  
  49.   center.x = (int) (m10/m00);  
  50.   center.y = (int) (m01/m00);  
  51.   return 0;  
  52.  }   
  53.   
  54.  IplImage* binary_image(IplImage* src)  
  55.  {  
  56.        
  57.   
  58.         // cvThreshold( src, src, 100, 255, CV_THRESH_BINARY );//100 is the thredhold   
  59.          IplImage* one_channel = cvCreateImage(cvSize(src->width,src->height),IPL_DEPTH_8U,0);  
  60.           
  61.          for(int y = 0;y < src->height;y++)  
  62.          {  
  63.              char *ptr= src->imageData + y * src->widthStep;  
  64.              char *p_one_channel = one_channel->imageData + y * one_channel->widthStep;  
  65.              for(int x = 0;x < src->width;x++)  
  66.              {  
  67.                  int temp = ptr[3*x];  
  68.                  if (temp != 0)//不是黑色也就是说不是背景  
  69.                  {  
  70.                      p_one_channel[x] = 255;//设置为白色  
  71.                  }  
  72.                  else  
  73.                  {  
  74.                      p_one_channel[x] = 0;  
  75.   
  76.                  }  
  77.                  //ptr[3*x]=  
  78.                  //ptr[3*x+1]=  
  79.                  //ptr[3*x+2]=;   
  80.              }  
  81.          }  
  82.          return one_channel;  
  83.   
  84.   
  85.  }  
  86.   
  87. int _tmain(int argc, _TCHAR* argv[])  
  88. {  
  89.     string str_name = "seg_right.bmp";  
  90.   
  91.     IplImage* src;   
  92.     IplImage* draw = cvLoadImage(str_name.c_str(),1);//绘制重心的图像  
  93.       
  94.     if ((src = cvLoadImage(str_name.c_str(),1))!=0)  
  95.     {  
  96.         //src = binary_image(src);  
  97.         cvNamedWindow( "binary image", 1 );   
  98.         cvShowImage( "binary image", binary_image(src) );  
  99.     }  
  100.     CvPoint xy;  
  101.     aoiGravityCenter(binary_image(src),xy);  
  102.     cout<<xy.x<<endl;  
  103.     cout<<xy.y<<endl;  
  104.   
  105.   
  106.     cvCircle(draw,cvPoint(xy.x,xy.y),3,CV_RGB(0,0,255),5);  
  107.   
  108.     cvNamedWindow( "重心", 1 );   
  109.     cvShowImage( "重心", draw );   
  110.   
  111.     cvWaitKey(0);  
  112.     return 0;  
  113. }  




我调试好的工程:点击打开链接

http://download.csdn.net/detail/wangyaninglm/9389338 


0 0