コード例 #1
0
ファイル: cvseq.cpp プロジェクト: MattNguyen/ruby-opencv
VALUE
rb_seq_push(VALUE self, VALUE args, int flag)
{
  CvSeq *seq = CVSEQ(self);
  VALUE klass = seqblock_class(seq), object;
  void *buffer = NULL;
  for (int i = 0; i < RARRAY_LEN(args); i++) {
    object = RARRAY_PTR(args)[i];
    if (CLASS_OF(object) == klass) {
      if (flag == CV_FRONT)
	cvSeqPushFront(seq, DATA_PTR(object));
      else
	cvSeqPush(seq, DATA_PTR(object));
    }
    else if (rb_obj_is_kind_of(object, rb_klass) && CLASS_OF(rb_first(object)) == klass) { // object is CvSeq
      buffer = cvCvtSeqToArray(CVSEQ(object), cvAlloc(CVSEQ(object)->total * CVSEQ(object)->elem_size));
      cvSeqPushMulti(seq, buffer, CVSEQ(object)->total, flag);
      cvFree(&buffer);
    }
    else {
      rb_raise(rb_eTypeError, "arguments should be %s or %s which includes %s.",
	       rb_class2name(klass), rb_class2name(rb_klass), rb_class2name(klass));
    }
  }
  return self;
}
コード例 #2
0
bool ContoursProcessor::FindContours()
{
	if (storage==NULL)
    {
      storage = cvCreateMemStorage(0);
    }
    else
    {
      cvClearMemStorage(storage);
    }
    cvFindContours( Tmp_img, storage, &contours, sizeof(CvContour),
                    CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0) );
	if(ImageResult)
		cvClearSeq(ImageResult);
    if (contours)
    {
      if (ResultsStorage==NULL)
      {
        ResultsStorage = cvCreateMemStorage(0);
      }
      else
      {
        cvClearMemStorage(ResultsStorage);
      }
      ImageResult = cvCreateSeq(0,sizeof(CvSeq),sizeof(T_MEAS_RESULTS_REC),ResultsStorage);
      T_MEAS_RESULTS_REC ContourResult;
      int Idx=1;
      for( CvSeq* c=contours; c!=NULL; c=c->h_next ) { 
      //for (i=0;i<contours->total;i++)
        //ImageResult
        if (ImageResult)
        {
          cvContourMoments(c,&Moments);
          if ((Moments.m00>3000.0)&&(Moments.m00<8000.0))
          {
            memset(&ContourResult,0,sizeof(ContourResult));
            ContourResult.ObjNo=Idx;
            ContourResult.Area = Moments.m00;
            ContourResult.Center.x = Moments.m10/Moments.m00;
            ContourResult.Center.y = Moments.m01/Moments.m00;
            cvSeqPushFront(ImageResult,&ContourResult);
            Idx++;
          }
        }
      }
      CalcResult(ImageResult); 
      //PrintResults(0, res_img,ImageResult);
      cvDrawContours( cnt_img, contours, CV_RGB(128,0,0), CV_RGB(0,128,0), 3, 1, CV_AA, cvPoint(0,0) );
    }

	return true;
}
コード例 #3
0
bool ContoursProcessor::CalcResult(CvSeq *Results)
{
  int i;
  T_MEAS_RESULTS_REC *ContourResult;
  T_MEAS_RESULTS_REC ContourStatResult;
  T_MEAS_RESULTS_REC *ContourStatResultP; // points in result queue
  for (i=0;i<Results->total;i++)
  {
    //sprintf(TextLine,FormatLine,);
    ContourResult = (T_MEAS_RESULTS_REC *) cvGetSeqElem(ImageResult,i);
    memset(&ContourStatResult,0,sizeof(ContourStatResult));
    if (!ImageStatResult)
    {
      ImageStatResult = cvCreateSeq(0,sizeof(CvSeq),sizeof(T_MEAS_RESULTS_REC),ResultsStorage);
    }
    if (ImageStatResult->total<Results->total)
    {
      // Inserting new elements for the first time
      ContourStatResult.Area = ContourResult->Area;
      ContourStatResult.ObjNo = ContourResult->ObjNo;
      ContourStatResult.Center.x = ContourResult->Center.x;
      ContourStatResult.Center.y = ContourResult->Center.y;
      ContourStatResult.Min.x = 32000;
      ContourStatResult.Min.y = 32000;
      ContourStatResult.Max.x = 0;
      ContourStatResult.Max.y = 0;
      cvSeqPushFront(ImageStatResult,&ContourStatResult);
    }
    else
    {
      ContourStatResultP = (T_MEAS_RESULTS_REC *) cvGetSeqElem(ImageStatResult,i);
      if (ContourStatResultP)
      {
        ContourStatResultP->Area += ContourResult->Area;
        ContourStatResultP->ObjNo = ContourResult->ObjNo;
        ContourStatResultP->Center.x += ContourResult->Center.x;
        ContourStatResultP->Center.y += ContourResult->Center.y;
        // Calc min x
        if (ContourStatResultP->Min.x>ContourResult->Center.x)
        {
          ContourStatResultP->Min.x = ContourResult->Center.x;
        }
        // Calc min y
        if (ContourStatResultP->Min.y>ContourResult->Center.y)
        {
          ContourStatResultP->Min.y = ContourResult->Center.y;
        }
        // Calc Max x
        if (ContourStatResultP->Max.x<ContourResult->Center.x)
        {
          ContourStatResultP->Max.x = ContourResult->Center.x;
        }
        // Calc Max y
        if (ContourStatResultP->Max.y<ContourResult->Center.y)
        {
          ContourStatResultP->Max.y = ContourResult->Center.y;
        }
      }

    }
  }
  return true;
}