使用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);
}