aihot  2017-05-28 11:53:33  OpenCV |   查看评论   
  • #include "cv.h" 
  • #include "highgui.h" 
  •  
  • void main( int argc, char** argv ) 
  • IplImage* src; 
  • CvMoments moments; 
  • CvMat *region; 
  • CvPoint pt1,pt2; 
  • double m00 = 0, m10, m01, mu20, mu11, mu02, inv_m00; 
  • double a, b, c; 
  • int xc, yc; 
  • // 第一条命令行参数确定了图像的文件名。 
  • if( (src=cvLoadImage("two.bmp", 0))!= 0) 
  • //if( (src=cvLoadImage("fbb.jpg", 0))!= 0) 
  • //if( argc == 2 && (src=cvLoadImage(argv[1], 0))!= 0) 
  • IplImage* dst = cvCreateImage( cvGetSize(src), 8, 3 ); 
  • CvMemStorage* storage = cvCreateMemStorage(0); 
  • CvSeq* contour = 0; 
  •  
  • cvThreshold( src, src, 100, 255, CV_THRESH_BINARY );//100 is the thredhold 
  • cvNot( src, src ); 
  • cvNamedWindow( "Source", 1 ); 
  • cvShowImage( "Source", src ); 
  •  
  • //cvFindContours( src, storage, &contour, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0) ); 
  •  
  • cvFindContours( src, storage, &contour, sizeof(CvContour),CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0) ); 
  • cvZero( dst ); 
  •  
  • for( ; contour != 0; contour = contour->h_next ) 
  • //CvScalar color = CV_RGB( rand()&255, rand()&255, rand()&255 ); 
  • CvScalar color = CV_RGB( 255, 0,0 ); 
  • /* 用1替代 CV_FILLED 所指示的轮廓外形 */ 
  • cvDrawContours( dst, contour, color, color, -1, CV_FILLED, 8,cvPoint(0,0) );//you can change 1 to CV_FILLED 
  • contour = cvApproxPoly( contour, sizeof(CvContour), storage, CV_POLY_APPROX_DP, 3, 1 ); 
  • //CvRect* r = (CvRect*)cvGetSeqElem( contour,1); 
  • region=(CvMat*)contour; 
  • cvMoments( region, &moments,0 ); 
  • //cvMoments( &contour, &moments,0 ); 
  • // cvDrawContours( cnt_img, _contours, CV_RGB(255,0,0), CV_RGB(0,255,0), _levels, 3, CV_AA, cvPoint(0,0) ); CV_FILLED 
  • //////////////////////////////////////////////// 
  • ///////////////////////////////////////////////// 
  • m00 = moments.m00; 
  • m10 = moments.m10; 
  • m01 = moments.m01; 
  • mu11 = moments.mu11; 
  • mu20 = moments.mu20; 
  • mu02 = moments.mu02; 
  •  
  • //if( fabs(m00) < DBL_EPSILON )break; 
  •  
  • inv_m00 = 1. / m00; 
  • xc = cvRound( m10 * inv_m00 ); 
  • yc = cvRound( m01 * inv_m00 ); 
  • a = mu20 * inv_m00; 
  • b = mu11 * inv_m00; 
  • c = mu02 * inv_m00; 
  • ///////////////// 
  • pt1.x=xc-1;pt1.y=yc; 
  • pt2.x=xc+1;pt2.y=yc; 
  • cvLine( dst, pt1, pt2, CV_RGB(0,255,0), 2, CV_AA, 0 ); 
  • pt1.x=xc;pt1.y=yc-1; 
  • pt2.x=xc;pt2.y=yc+1; 
  • cvLine( dst, pt1, pt2, CV_RGB(0,255,0), 2, CV_AA, 0 ); 
  •  
  • cvNamedWindow( "Components", 1 ); 
  • cvShowImage( "Components", dst ); 
  • cvWaitKey(0); 
  • }
 

除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自利用OpenCV求取图像的重心

留言与评论(共有 0 条评论)
   
验证码:
[lianlun]1[/lianlun]