OpenCV几个函数用法(笔记)

来源:互联网 发布:python分析日志文件 编辑:程序博客网 时间:2024/05/24 01:44

 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可以提取单像素区域边界,但若改单像素处于图像边缘则提取会断开,即会被分成多个边界,如下影像会提取两个边界

2552550000000000000000255255255000000000000000255255255000000000000000255255255000000000000000255255255000000000000025525525525525525500000000000255255255255255255255000000000255255255255255255255255255255255255255255255255255255255255255255255但是如下影像则是一个边界

2550000000000025525500000000025525525500000000255255255255000000002552552552550000000255255255255255255000000255255255255255255255255255255255255255255255000000000000