利用opencv,在closeimage的各个连通域中寻找重心,并圈出矩形框
- cvFindContours(closeimage,storage,&contour,sizeof(CvContour),CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE);
- CvMoments m;
- CvMat mat;
- double M00;
- CvSeq*contour2=contour;
- IplImage *pTmp=cvCreateImage(cvGetSize(closeimage),IPL_DEPTH_8U,1);
- IplImage *pTmp1=cvCreateImage(cvGetSize(closeimage),IPL_DEPTH_8U,1);
- for(;contour2!=0;contour2=contour2->h_next)
- {
- CvRect rect=cvBoundingRect(contour2); //得到边界的矩形框
- cvDrawContours(pTmp,contour2,CV_RGB(255,255,255),CV_RGB(255,255,255),-1, 1, 8);
- 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);
- int n=contour->total;
- CvRect r=((CvContour*)contour2)->rect;
- CvPoint2D32f center;
- cvMoments(cvGetSubRect(pTmp,&mat,r),&m,0);
- M00=cvGetSpatialMoment(&m,0,0);
- center.x=cvGetSpatialMoment(&m,1,0)/M00; //重心为(centerx.+r.x,center.y+r.y)
- center.y=cvGetSpatialMoment(&m,0,1)/M00;
- double nHalfW,nHalfH;
- nHalfW=center.x<(r.width-center.x)?center.x:(r.width-center.x);
- nHalfH=center.y<(r.height-center.y)?center.y:(r.height-center.y);
- cvDrawContours(pTmp1,contour2,CV_RGB(255,255,255),CV_RGB(255,255,255),-1, 1, 8);
- 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);
- cvSaveImage("contoursss.bmp",pTmp);
- cvSaveImage("contoursss1.bmp",pTmp1);
- }
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 ¢er)
{
//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;
}
* @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 ¢er)
{
//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;
}