2017-08-05 153 views
0

嗨,我想學習opencv。用這個代碼我試圖把圓圈放到物體的中心。當我嘗試寫1,2,3等它是okey,但是當我嘗試將圓添加到對象的中心時,這是問題。 。C++ opencv找到對象的中心並添加圓圈

我的代碼:

void findcontours(){ 
    cv::namedWindow("contourdemo",CV_GUI_EXPANDED); 
    src = cv::imread("/home/zugurtaga/Desktop/project/opencv/imgs/seed.jpg"); 
     if(src.data){ 

      if(src.channels() > 1){ 
       cv::cvtColor(src,src,CV_RGB2GRAY); 
      }else { 
       src = src; 
      } 

      cv::Mat cImc = src.clone(); 
      cv::threshold(cImc,cImc,150,255,CV_THRESH_BINARY_INV | CV_THRESH_OTSU); 
      cv::imshow("contourdemo",cImc); 
      cv::waitKey(0); 


      vector<vector <cv::Point> > contours; 
      vector<cv::Point> contPoly; 
      vector<cv::Vec4i> hierarchy; 
      cv::findContours(cImc,contours,hierarchy,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE); 
      cout << "Number of counts: " << contours.size() << endl; 

      tmp = cv::Mat::zeros(cImc.size(),CV_8UC3); 
      cv::RotatedRect rRect; 

      //Problem line ??? 
      shapeMoments = cv::moments(contours); 
      cv::HuMoments(shapeMoments,shapeHumoments); 

      centerofmass.x = (shapeMoments.m10/shapeMoments.m00); 
      centerofmass.y = (shapeMoments.m01/shapeMoments.m00); 
      cout << "centerofmass.x: " << centerofmass.x << " centerofmass.y: " << centerofmass.y << endl; 
      // till here 

      for (size_t i = 0; i < contours.size(); i++) { 
       cv::drawContours(tmp,contours,i,cv::Scalar(120,0,0),CV_FILLED,8,hierarchy,0,cv::Point()); 
       rRect = cv::minAreaRect(contours[i]); 
       cv::putText(tmp,cv::format("%d",i+1),rRect.center,1,1,cv::Scalar(255,255,255)); 
       cv::circle(tmp,centerofmass,(int)3,cv::Scalar(255,255,255),-1,8,0); 

      } 

      cv::imshow("contourdemo",tmp); 
      cv::waitKey(0); 
      cv::destroyAllWindows(); 

     }else{ 
      cout << "No file.." << endl; 
     } 
} 

感謝您的幫助。

回答

0

我發現問題後,一些嘗試這是工作。

for (size_t i = 0; i < contours.size(); i++) { 
       shapeMoments = cv::moments(contours[i]); 
       cv::HuMoments(shapeMoments,shapeHumoments); 

       centerofmass.x = (shapeMoments.m10/shapeMoments.m00); 
       centerofmass.y = (shapeMoments.m01/shapeMoments.m00); 

       cout << "centerofmass.x: " << centerofmass.x << " centerofmass.y: " << centerofmass.y << endl; 

       cv::drawContours(tmp,contours,i,cv::Scalar(120,0,0),CV_FILLED,8,hierarchy,0,cv::Point()); 
       rRect = cv::minAreaRect(contours[i]); 
       cv::putText(tmp,cv::format("%d",i+1),centerofmass,1,1,cv::Scalar(255,255,255)); 
       cv::circle(tmp,centerofmass,(int)3,cv::Scalar(255,255,255),-1,8,0); 

      } 

enter image description here