使用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 = 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 = 0; } // 5. revert image for (int h=0;himgCC-height;h++) { for (int w=0;wimgCC-width;w++) { int v = (int)(unsigned char)imgCC-imageData ; if (v==255) imgCC-imageData = 0; else imgCC-imageData =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 = 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;himgInner-height;h++) { for (int w=0;wimgInner-width;w++) { if ((int)(unsigned char)(imgInner-imageData ) == 0) imgCC-imageData = 0; } } } cvReleaseImage(imgInner); }