[转]根据边界填充联通域

使用OpenCV提取的contour

void CFreeExtract::PaintCC(CvSeq* contour, IplImage* imgCC,int nTop, int nLeft)
{
// 1. paint as black
cvZero(imgCC);

// 2. paint contour as white
for( int i = 0; i < contour->total; i++ )
{
   CvPoint* line = (CvPoint*)cvGetSeqElem(contour,i); //just a pointer!
   int w = line->x-nLeft+1;
   int h = line->y-nTop+1;

   imgCC->imageData[h*imgCC->widthStep+w] = 255;
}

// 3. fill outer space as white
cvFloodFill(imgCC,cvPoint(0,0),cvScalar(255));

// 4. paint contour as black
for( int i = 0; i < contour->total; i++ )
{
   CvPoint* line = (CvPoint*)cvGetSeqElem(contour,i); //just a pointer!
   int w = line->x-nLeft+1;
   int h = line->y-nTop+1;

   imgCC->imageData[h*imgCC->widthStep+w] = 0;
}

// 5. revert image
for (int h=0;h<imgCC->height;h++)
{
   for (int w=0;w<imgCC->width;w++)
   {
    int v = (int)(unsigned char)imgCC->imageData[h*imgCC->widthStep+w];
    if (v==255)
     imgCC->imageData[h*imgCC->widthStep+w] = 0;
    else
     imgCC->imageData[h*imgCC->widthStep+w]=255;
   }
}

// 6.paint inner contour
IplImage* imgInner = cvCloneImage(imgCC);
CvSeq* contourInner = contour->v_next;
for( ; contourInner != 0; contourInner = contourInner->h_next )
{
   // 6.1 draw inner contour as white
   cvZero(imgInner);
   for( int i = 0; i < contourInner->total; i++ )
   {
    CvPoint* line = (CvPoint*)cvGetSeqElem(contourInner,i); //just a pointer!
    int h = line->y-nTop+1;
    int w = line->x-nLeft+1;
    imgInner->imageData[h*imgInner->widthStep+w] = 255;
   }

   // 4.2 flood background as white
   cvFloodFill( imgInner, cvPoint(0,0), cvScalar(255));   // 255~back


   // 4.4 erase holes in m_pbPix
   for (int h=0;h<imgInner->height;h++)
   {
    for (int w=0;w<imgInner->width;w++)
    {
     if ((int)(unsigned char)(imgInner->imageData[h*imgInner->widthStep+w]) == 0)
      imgCC->imageData[h*imgCC->widthStep+w] = 0;
    }
   }
  
}
cvReleaseImage(&imgInner);

}

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值