如何寻找连通域的重心

利用opencv,在closeimage的各个连通域中寻找重心,并圈出矩形框

[cpp]  view plain copy
  1. cvFindContours(closeimage,storage,&contour,sizeof(CvContour),CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE);  
  2. CvMoments m;  
  3.  CvMat mat;  
  4.  double M00;  
  5.  CvSeq*contour2=contour;  
  6.  IplImage *pTmp=cvCreateImage(cvGetSize(closeimage),IPL_DEPTH_8U,1);  
  7.  IplImage *pTmp1=cvCreateImage(cvGetSize(closeimage),IPL_DEPTH_8U,1);  
  8.  for(;contour2!=0;contour2=contour2->h_next)  
  9.  {   
  10.   CvRect rect=cvBoundingRect(contour2); //得到边界的矩形框  
  11.   cvDrawContours(pTmp,contour2,CV_RGB(255,255,255),CV_RGB(255,255,255),-1, 1, 8);  
  12.   cvRectangle(pTmp,cvPoint(rect.x,rect.y),cvPoint(rect.x+rect.width,rect.y+rect.height),CV_RGB(255,255,255),1,CV_AA,0);  
  13.    
  14.   int n=contour->total;  
  15.   CvRect r=((CvContour*)contour2)->rect;  
  16.   CvPoint2D32f center;  
  17.   cvMoments(cvGetSubRect(pTmp,&mat,r),&m,0);  
  18.   M00=cvGetSpatialMoment(&m,0,0);  
  19.   center.x=cvGetSpatialMoment(&m,1,0)/M00; //重心为(centerx.+r.x,center.y+r.y)  
  20.   center.y=cvGetSpatialMoment(&m,0,1)/M00;  
  21.   double nHalfW,nHalfH;  
  22.   nHalfW=center.x<(r.width-center.x)?center.x:(r.width-center.x);  
  23.   nHalfH=center.y<(r.height-center.y)?center.y:(r.height-center.y);  
  24. cvDrawContours(pTmp1,contour2,CV_RGB(255,255,255),CV_RGB(255,255,255),-1, 1, 8);  
  25.   cvRectangle(pTmp1,cvPoint(center.x+r.x-nHalfW,center.y+r.y-nHalfH),cvPoint(center.x+r.x+nHalfW,center.y+r.y+nHalfH),CV_RGB(255,255,255),1,CV_AA,0);  
  26.    
  27.   cvSaveImage("contoursss.bmp",pTmp);  
  28.   cvSaveImage("contoursss1.bmp",pTmp1);  
  29.  }  

http://blog.163.com/forever_871226/blog/static/34424308201141851736984/

/** 计算二值图像的重心
* @param[in] src  输入的待处理图像
* @param[out] center 重心坐标
* @retval 0  操作成功
* @retval -1 操作失败
* @note 输入图像是二值化图像
* @note xc=M10/M00, yc=M01/M00, 其中 Mx_order,y_order=SUMx,y(I(x,y)*x^x_order*y^y_order)
*/
static int aoiGravityCenter(IplImage *src, CvPoint &center)
{
 //if(!src)
 // return GRAVITYCENTER__SRC_IS_NULL;
 double m00, m10, m01;
 CvMoments moment;
 cvMoments( src, &moment, 1);
 m00 = cvGetSpatialMoment( &moment, 0, 0 );
 if( m00 == 0) 
  return 1;
 m10 = cvGetSpatialMoment( &moment, 1, 0 );
 m01 = cvGetSpatialMoment( &moment, 0, 1 );
 center.x = (int) (m10/m00);
 center.y = (int) (m01/m00);
 return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值