Opencv以目标重心上下分割人的上下半身

来源:互联网 发布:安迪沃霍尔知乎 编辑:程序博客网 时间:2024/06/12 01:24

int colorclass::aoiGravityCenter(IplImage *src, CvPoint &center)

{
if(!src)
return -1;
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;
}


void CutPicture(char * filename, IplImage* &pDest_Upper,IplImage* &pDest_Lower)

{
IplImage *src = cvLoadImage(filename,1);
IplImage *src_g = cvLoadImage(filename,0);
//发现目标中心
CvPoint center;
int cc =  aoiGravityCenter(src_g, center);
CvScalar wr = CV_RGB(255,0,255);


//以重心点为中心,上下分割图片。
CvSize size_1= cvSize(src->width,center.y);//区域大小
cvSetImageROI(src,cvRect(0,0,size_1.width, size_1.height));//设置源图像ROI
IplImage* pDest_1 = cvCreateImage(size_1,src->depth,src->nChannels);//创建目标图像
cvCopy(src,pDest_1); //复制图像
cvResetImageROI(pDest_1);//源图像用完后,清空ROI
pDest_Upper = pDest_1;


CvSize size_2= cvSize(src->width,src->height - center.y);//区域大小
cvSetImageROI(src,cvRect(0,center.y,size_2.width, size_2.height));//设置源图像ROI
IplImage* pDest_2 = cvCreateImage(size_2,src->depth,src->nChannels);//创建目标图像
cvCopy(src,pDest_2); //复制图像
cvResetImageROI(pDest_2);//源图像用完后,清空ROI
pDest_Lower = pDest_2;


cvReleaseImage(&src);
cvReleaseImage(&src_g);
}
0 0
原创粉丝点击