CvPoint *cvPtArr = new CvPoint[ptNumo];
for (int i=0; i<ptNumo; i++)
{
cvPtArr[i].x = (int)(xo[i]+0.5f);
cvPtArr[i].y = (int)(yo[i]+0.5f);
}
CvMat *mat = cvCreateMat(nWholeImgH-1, nWholeImgW-1, CV_8U);
cvFillPoly(mat, &cvPtArr, &ptNumo, 1, CV_RGB(10,10,10));cvFlip(mat);
CvSeq * cont = 0;
CvMemStorage *stor = cvCreateMemStorage(0);
cont = cvCreateSeq(CV_SEQ_ELTYPE_POINT, sizeof(CvSeq), sizeof(CvPoint), stor);
int Number_Object = cvFindContours( mat, stor, &cont, sizeof(CvContour),
CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0) ); //找到所有轮廓/CV_RETR_CCOMP/CV_RETR_LIST
CvSeq * contD = 0;
CvMemStorage *storD = cvCreateMemStorage(0);
contD = cvCreateSeq(CV_SEQ_ELTYPE_POINT, sizeof(CvSeq), sizeof(CvPoint), storD);
CvPoint pttmp;
CDC *pDC = GetDC();
for(;cont;cont = cont->h_next)
{
cvDrawContours( mat, cont, CV_RGB(155, 155, 155), CV_RGB(0, 0, 0), 0, -1, 8, cvPoint(0, 0));
for ( int k=0; k<cont->total; k++ )
{
pttmp = *(CvPoint*)cvGetSeqElem(cont, k);
pDC->SetPixel(pttmp.x, pttmp.y, RGB(0,0,255));
}
//cvApproxPoly()
//mcont=cvApproxPoly(cont,sizeof(CvContour),mstor,CV_POLY_APPROX_DP,cvContourPerimeter(cont)*0.02,0);
contD = cvApproxPoly(cont, sizeof(CvContour), storD, CV_POLY_APPROX_DP,1.0,1);//cvContourPerimeter(cont)*
cvDrawContours(mat,contD,CV_RGB(255,0,0),CV_RGB(0,0,255),1,2,8,cvPoint(0,0));
//contD = cvFindDominantPoints(cont, storD);
for ( int k=0; k<contD->total; k++ )
{
pttmp = *(CvPoint*)cvGetSeqElem(contD, k);
pDC->SetPixel(pttmp.x, pttmp.y, RGB(0,255,255));
}
}//cvFindDominantPoints()
cvNamedWindow("Show_Result");
cvShowImage("Show_Result", mat);
delete []cvPtArr;
另,cvFindContours使用注意事项:
cvFindContours可以提取单像素区域边界,但若改单像素处于图像边缘则提取会断开,即会被分成多个边界,如下影像会提取两个边界
255 | 255 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
255 | 255 | 255 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
255 | 255 | 255 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
255 | 255 | 255 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
255 | 255 | 255 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 255 | 255 |
255 | 255 | 255 | 255 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 255 | 255 | 255 |
255 | 255 | 255 | 255 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 255 | 255 | 255 | 255 | 255 |
255 | 255 | 255 | 255 | 255 | 255 | 255 | 255 | 255 | 255 | 255 | 255 | 255 | 255 | 255 | 255 | 255 | 255 |
255 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
255 | 255 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 255 |
255 | 255 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 255 | 255 |
255 | 255 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 255 | 255 |
255 | 255 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 255 | 255 | 255 |
255 | 255 | 255 | 0 | 0 | 0 | 0 | 0 | 0 | 255 | 255 | 255 |
255 | 255 | 255 | 255 | 255 | 255 | 255 | 255 | 255 | 255 | 255 | 255 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |