opencv 구 해 구역 의 내 접 직사각형

실험실 프로젝트 에서 원형 구역 과 비슷 한 질량 심 을 구 하려 고 하 는데 원래 최소 외접원 의 질량 심 을 사용 하여 같은 효 과 를 이 지역 의 질량 심 으로 한다.그러나 일부 지역 의 모양 이 너무 불규칙 해서 질 심 오프셋 현상 이 발생 한다.다음 그림:

파란색 은 실제 적 으로 질 심 을 요구한다.빨간색 은 등가 원 질 심 이다.
비교적 정확 한 질량 심 을 얻 기 위해 서 는 최대 내 접 사각형 의 중심 을 이 지역 의 질량 심 으로 할 계획 이다.
개 선 된 중심 확산 법 으로 내 접 사각형 을 구하 십시오.먼저 최소 외 접 사각형 의 중심 을 알고리즘 의 출발점 으로 중심 확산 을 합 니 다.내 해 사각형 을 얻 고 최소 외 접 모멘트 의 중심 을 8 인접 도 메 인 으로 옮 겨 다 니 며 중심 확산 법 을 응용 하여 각각 내 접 토 크 를 구하 고 면적 이 가장 큰 내 접 토 크 를 최대 내 접 토 크 로 한다.
Opencv 키 코드 를 사용 하면 다음 과 같 습 니 다.

/**
 * @brief          
 * @param img:    ,      ,   8
 * @param center:        
 * @return       
 *         
 */
cv::Rect InSquare(Mat &img,const Point center)
{
  // --[1]    
  if(img.empty()||
      img.channels()>1
      ||img.depth()>8)
    return Rect();
  //[1]
 
  // --[2]      
  int edge[4];
  edge[0]=center.y+1;//top
  edge[1]=center.x+1;//right
  edge[2]=center.y-1;//bottom
  edge[3]=center.x-1;//left
  //[2]
 
  // --[3]    (     )
  bool EXPAND[4]={1,1,1,1};//     
  int n=0;
  while (EXPAND[0]||EXPAND[1]||EXPAND[2]||EXPAND[3])
  {
    int edgeID=n%4;
    EXPAND[edgeID]=expandEdge(img,edge,edgeID);
 
    n++;
  }
  //[3]
 
  qDebug()<<edge[0]<<edge[1]<<edge[2]<<edge[3];
  Point tl=Point(edge[3],edge[0]);
  Point br=Point(edge[1],edge[2]);
  return Rect(tl,br);
}
 
/**
 * @brief expandEdge       
 * @param img:    ,      ,   8
 * @param edge     ,  4    
 * @param edgeID      
 * @return                 
 */
bool expandEdge(const Mat & img, int edge[], const int edgeID)
{
  //[1] --     
  int nc=img.cols;
  int nr=img.rows;
 
  switch (edgeID) {
  case 0:
    if(edge[0]>nr)
      return false;
    for(int i=edge[3];i<=edge[1];++i)
    {
      if(img.at<uchar>(edge[0],i)==0)
        return false;
    }
    edge[0]++;
    return true;
    break;
  case 1:
    if(edge[1]>nc)
      return false;
    for(int i=edge[2];i<=edge[0];++i)
    {
      if(img.at<uchar>(i,edge[1])==0)
        return false;
    }
    edge[1]++;
    return true;
    break;
  case 2:
    if(edge[2]<0)
      return false;
    for(int i=edge[3];i<=edge[1];++i)
    {
      if(img.at<uchar>(edge[2],i)==0)
        return false;
    }
    edge[2]--;
    return true;
    break;
  case 3:
    if(edge[3]<0)
      return false;
    for(int i=edge[2];i<=edge[0];++i)
    {
      if(img.at<uchar>(i,edge[3])==0)
        return false;
    }
    edge[3]--;
    return true;
    break;
  default:
    return false;
    break;
  }
}
효과:

검은색 은 내 접 모멘트 중심 이 고 빨간색 은 최소 외 접 원 중심 이다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기