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; }
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; }
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; }