OpenCV几个函数用法(笔记)

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

2552550000000000000000
255255255000000000000000
255255255000000000000000
255255255000000000000000
2552552550000000000000255255
25525525525500000000000255255255
255255255255000000000255255255255255
255255255255255255255255255255255255255255255255255255
但是如下影像则是一个边界

25500000000000
255255000000000255
25525500000000255255
25525500000000255255
2552550000000255255255
255255255000000255255255
255255255255255255255255255255255255
000000000000


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值