学习opencv——习题8-7,8-9,计算轮廓矩

计算轮廓矩,随便计算了一下轮廓长度,轮廓的质心

#include <cv.h>
#include <opencv2/legacy/legacy.hpp>
#include <stdio.h>
#include <stdlib.h>
#include "highgui.h"
using namespace std;
using namespace cv;

int main( int argc, char** argv )
{
IplImage* img = cvLoadImage("tu8-9.png", CV_LOAD_IMAGE_GRAYSCALE);
cvNamedWindow("image");
cvShowImage("image",img);
//二值化
IplImage* img_threshold=cvCreateImage(cvGetSize(img),img->depth,1);
cvThreshold(img,img_threshold,100,255,CV_THRESH_BINARY);
//检测轮廓
cvZero(img);
CvSeq* contours = 0;
CvMemStorage* storage_ct = cvCreateMemStorage(0);
cvFindContours( img_threshold, storage_ct, &contours, sizeof(CvContour),CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE );
//多边形逼近
contours = cvApproxPoly( contours, sizeof(CvContour), storage_ct, CV_POLY_APPROX_DP, 3, 1 );
cvDrawContours(img, contours, cvScalarAll(100), cvScalarAll(200), 100 );
cvNamedWindow( "contour" );
cvShowImage( "contour", img );

//计算轮廓矩
CvMoments moment;
cvMoments(contours,&moment,0);
double m00=cvGetSpatialMoment(&moment,0,0);
cout<<"轮廓边界长度:"<<m00<<endl;
double m10=cvGetSpatialMoment(&moment,1,0);
double m01=cvGetSpatialMoment(&moment,0,1);
double x=m10/m00;
double y=m01/m00;
cout<<"质心为:("<<x<<","<<y<<")"<<endl;

cvWaitKey(0);
cvReleaseMemStorage( &storage_ct );
cvReleaseImage( &img );
cvReleaseImage(&img_threshold);
cvDestroyAllWindows();

return 0;
}

猜你喜欢

转载自www.cnblogs.com/yanzhixue/p/11363515.html
8-9