static CvTestSeqElem* icvTestSeqReadElemOne(CvTestSeq_* pTS, CvFileStorage* fs, CvFileNode* node) { int noise_type = CV_NOISE_NONE;; CvTestSeqElem* pElem = NULL; const char* pVideoName = cvReadStringByName( fs, node,"Video", NULL); const char* pVideoObjName = cvReadStringByName( fs, node,"VideoObj", NULL); if(pVideoName) { /* Check to noise flag: */ if( cv_stricmp(pVideoName,"noise_gaussian") == 0 || cv_stricmp(pVideoName,"noise_normal") == 0) noise_type = CV_NOISE_GAUSSIAN; if( cv_stricmp(pVideoName,"noise_uniform") == 0) noise_type = CV_NOISE_UNIFORM; if( cv_stricmp(pVideoName,"noise_speckle") == 0) noise_type = CV_NOISE_SPECKLE; if( cv_stricmp(pVideoName,"noise_salt_and_pepper") == 0) noise_type = CV_NOISE_SALT_AND_PEPPER; } if((pVideoName || pVideoObjName ) && noise_type == CV_NOISE_NONE) { /* Read other elements: */ if(pVideoName) pElem = icvTestSeqReadElemAll(pTS, fs, pVideoName); if(pVideoObjName) { CvTestSeqElem* pE; pElem = icvTestSeqReadElemAll(pTS, fs, pVideoObjName); for(pE=pElem;pE;pE=pE->next) { pE->ObjID = pTS->ObjNum; pE->pObjName = pVideoObjName; } pTS->ObjNum++; } } /* Read other elements. */ else { /* Create new element: */ CvFileNode* pPosNode = cvGetFileNodeByName( fs, node,"Pos"); CvFileNode* pSizeNode = cvGetFileNodeByName( fs, node,"Size"); int AutoSize = (pSizeNode && CV_NODE_IS_STRING(pSizeNode->tag) && cv_stricmp("auto",cvReadString(pSizeNode,""))==0); int AutoPos = (pPosNode && CV_NODE_IS_STRING(pPosNode->tag) && cv_stricmp("auto",cvReadString(pPosNode,""))==0); const char* pFileName = cvReadStringByName( fs, node,"File", NULL); pElem = (CvTestSeqElem*)cvAlloc(sizeof(CvTestSeqElem)); memset(pElem,0,sizeof(CvTestSeqElem)); pElem->ObjID = -1; pElem->noise_type = noise_type; cvRandInit( &pElem->rnd_state, 1, 0, 0,CV_RAND_NORMAL); if(pFileName && pElem->noise_type == CV_NOISE_NONE) { /* If AVI or BMP: */ size_t l = strlen(pFileName); pElem->pFileName = pFileName; pElem->type = SRC_TYPE_IMAGE; if(cv_stricmp(".avi",pFileName+l-4) == 0)pElem->type = SRC_TYPE_AVI; if(pElem->type == SRC_TYPE_IMAGE) { //pElem->pImg = cvLoadImage(pFileName); if(pElem->pImg) { pElem->FrameNum = 1; if(pElem->pImgMask)cvReleaseImage(&(pElem->pImgMask)); pElem->pImgMask = cvCreateImage( cvSize(pElem->pImg->width,pElem->pImg->height), IPL_DEPTH_8U,1); icvTestSeqCreateMask(pElem->pImg,pElem->pImgMask,FG_BG_THRESHOLD); } } if(pElem->type == SRC_TYPE_AVI && pFileName) { //pElem->pAVI = cvCaptureFromFile(pFileName); if(pElem->pAVI) { IplImage* pImg = 0;//cvQueryFrame(pElem->pAVI); pElem->pImg = cvCloneImage(pImg); pElem->pImg->origin = 0; //cvSetCaptureProperty(pElem->pAVI,CV_CAP_PROP_POS_FRAMES,0); pElem->FrameBegin = 0; pElem->AVILen = pElem->FrameNum = 0;//(int)cvGetCaptureProperty(pElem->pAVI, CV_CAP_PROP_FRAME_COUNT); //cvReleaseCapture(&pElem->pAVI); pElem->pAVI = NULL; } else { printf("WARNING!!! Cannot open avi file %s\n",pFileName); } } } /* If AVI or BMP. */ if(pPosNode) { /* Read positions: */ if(CV_NODE_IS_SEQ(pPosNode->tag)) { int num = pPosNode->data.seq->total; pElem->pPos = (CvPoint2D32f*)cvAlloc(sizeof(float)*num); cvReadRawData( fs, pPosNode, pElem->pPos, "f" ); pElem->PosNum = num/2; if(pElem->FrameNum == 0) pElem->FrameNum = pElem->PosNum; } } if(pSizeNode) { /* Read sizes: */ if(CV_NODE_IS_SEQ(pSizeNode->tag)) { int num = pSizeNode->data.seq->total; pElem->pSize = (CvPoint2D32f*)cvAlloc(sizeof(float)*num); cvReadRawData( fs, pSizeNode, pElem->pSize, "f" ); pElem->SizeNum = num/2; } } if(AutoPos || AutoSize) { /* Auto size and pos: */ int i; int num = (pElem->type == SRC_TYPE_AVI)?pElem->AVILen:1; if(AutoSize) { pElem->pSize = (CvPoint2D32f*)cvAlloc(sizeof(CvPoint2D32f)*num); pElem->SizeNum = num; } if(AutoPos) { pElem->pPos = (CvPoint2D32f*)cvAlloc(sizeof(CvPoint2D32f)*num); pElem->PosNum = num; } for(i=0; i<num; ++i) { IplImage* pFG = NULL; CvPoint2D32f* pPos = AutoPos?(pElem->pPos + i):NULL; CvPoint2D32f* pSize = AutoSize?(pElem->pSize + i):NULL; icvTestSeqQureyFrameElem(pElem,i); pFG = pElem->pImgMask; if(pPos) { pPos->x = 0.5f; pPos->y = 0.5f; } if(pSize) { pSize->x = 0; pSize->y = 0; } if(pFG) { double M00; CvMoments m; cvMoments( pElem->pImgMask, &m, 0 ); M00 = cvGetSpatialMoment( &m, 0, 0 ); if(M00 > 0 && pSize ) { double X = cvGetSpatialMoment( &m, 1, 0 )/M00; double Y = cvGetSpatialMoment( &m, 0, 1 )/M00; double XX = (cvGetSpatialMoment( &m, 2, 0 )/M00) - X*X; double YY = (cvGetSpatialMoment( &m, 0, 2 )/M00) - Y*Y; pSize->x = (float)(4*sqrt(XX))/(pElem->pImgMask->width-1); pSize->y = (float)(4*sqrt(YY))/(pElem->pImgMask->height-1); } if(M00 > 0 && pPos) { pPos->x = (float)(cvGetSpatialMoment( &m, 1, 0 )/(M00*(pElem->pImgMask->width-1))); pPos->y = (float)(cvGetSpatialMoment( &m, 0, 1 )/(M00*(pElem->pImgMask->height-1))); } if(pPos) { /* Another way to calculate y pos * using object median: */ int y0=0, y1=pFG->height-1; for(y0=0; y0<pFG->height; ++y0) { CvMat m; CvScalar s = cvSum(cvGetRow(pFG, &m, y0)); if(s.val[0] > 255*7) break; } for(y1=pFG->height-1; y1>0; --y1) { CvMat m; CvScalar s = cvSum(cvGetRow(pFG, &m, y1)); if(s.val[0] > 255*7) break; } pPos->y = (y0+y1)*0.5f/(pFG->height-1); } } /* pFG */ } /* Next frame. */ //if(pElem->pAVI) cvReleaseCapture(&pElem->pAVI); pElem->pAVI = NULL; } /* End auto position creation. */ } /* Create new element. */ if(pElem) { /* Read transforms and: */ int FirstFrame, LastFrame; CvTestSeqElem* p=pElem; CvFileNode* pTransNode = NULL; CvFileNode* pS = NULL; int ShiftByPos = 0; int KeyFrames[1024]; CvSeq* pTransSeq = NULL; int KeyFrameNum = 0; pTransNode = cvGetFileNodeByName( fs, node,"Trans"); while( pTransNode && CV_NODE_IS_STRING(pTransNode->tag) && cv_stricmp("auto",cvReadString(pTransNode,""))!=0) { /* Trans is reference: */ pTransNode = cvGetFileNodeByName( fs, NULL,cvReadString(pTransNode,"")); } pS = cvGetFileNodeByName( fs, node,"Shift"); ShiftByPos = 0; pTransSeq = pTransNode?(CV_NODE_IS_SEQ(pTransNode->tag)?pTransNode->data.seq:NULL):NULL; KeyFrameNum = pTransSeq?pTransSeq->total:1; if( (pS && CV_NODE_IS_STRING(pS->tag) && cv_stricmp("auto",cvReadString(pS,""))==0) ||(pTransNode && CV_NODE_IS_STRING(pTransNode->tag) && cv_stricmp("auto",cvReadString(pTransNode,""))==0)) { ShiftByPos = 1; } FirstFrame = pElem->FrameBegin; LastFrame = pElem->FrameBegin+pElem->FrameNum-1; /* Calculate length of video and reallocate * transformation array: */ for(p=pElem; p; p=p->next) { int v; v = cvReadIntByName( fs, node, "BG", -1 ); if(v!=-1)p->BG = v; v = cvReadIntByName( fs, node, "Mask", -1 ); if(v!=-1)p->Mask = v; p->FrameBegin += cvReadIntByName( fs, node, "FrameBegin", 0 ); p->FrameNum = cvReadIntByName( fs, node, "FrameNum", p->FrameNum ); p->FrameNum = cvReadIntByName( fs, node, "Dur", p->FrameNum ); { int LastFrame = cvReadIntByName( fs, node, "LastFrame", p->FrameBegin+p->FrameNum-1 ); p->FrameNum = MIN(p->FrameNum,LastFrame - p->FrameBegin+1); } icvTestSeqAllocTrans(p); { /* New range estimation: */ int LF = p->FrameBegin+p->FrameNum-1; if(p==pElem || FirstFrame > p->FrameBegin)FirstFrame = p->FrameBegin; if(p==pElem || LastFrame < LF)LastFrame = LF; } /* New range estimation. */ } /* End allocate new transfrom array. */ if(ShiftByPos) { for(p=pElem;p;p=p->next) { /* Modify transformation to make autoshift: */ int i; int num = p->FrameNum; assert(num <= p->TransNum); p->TransNum = MAX(1,num); for(i=0; i<num; ++i) { CvTSTrans* pT = p->pTrans+i; //float t = (num>1)?((float)i/(num-1)):0.0f; float newx = p->pPos[i%p->PosNum].x; float newy = p->pPos[i%p->PosNum].y; pT->Shift.x = -newx*pT->Scale.x; pT->Shift.y = -newy*pT->Scale.y; if(p->pImg) { newx *= p->pImg->width-1; newy *= p->pImg->height-1; } pT->T[2] = -(pT->T[0]*newx+pT->T[1]*newy); pT->T[5] = -(pT->T[3]*newx+pT->T[4]*newy); } } /* Modify transformation old. */ } /* Next record. */ /* Initialize frame number array: */ KeyFrames[0] = FirstFrame; if(pTransSeq&&KeyFrameNum>1) { int i0,i1,i; for(i=0; i<KeyFrameNum; ++i) { CvFileNode* pTN = (CvFileNode*)cvGetSeqElem(pTransSeq,i); KeyFrames[i] = cvReadIntByName(fs,pTN,"frame",-1); } if(KeyFrames[0]<0)KeyFrames[0]=FirstFrame; if(KeyFrames[KeyFrameNum-1]<0)KeyFrames[KeyFrameNum-1]=LastFrame; for(i0=0, i1=1; i1<KeyFrameNum;) { int i; for(i1=i0+1; i1<KeyFrameNum && KeyFrames[i1]<0; i1++); assert(i1<KeyFrameNum); assert(i1>i0); for(i=i0+1; i<i1; ++i) { KeyFrames[i] = cvRound(KeyFrames[i0] + (float)(i-i0)*(float)(KeyFrames[i1] - KeyFrames[i0])/(float)(i1-i0)); } i0 = i1; i1++; } /* Next key run. */ } /* Initialize frame number array. */ if(pTransNode || pTransSeq) { /* More complex transform. */ int param; CvFileNode* pTN = pTransSeq?(CvFileNode*)cvGetSeqElem(pTransSeq,0):pTransNode; for(p=pElem; p; p=p->next) { //int trans_num = p->TransNum; for(param=0; param_name[param]; ++param) { const char* name = param_name[param]; float defv = param_defval[param]; if(KeyFrameNum==1) { /* Only one transform record: */ int i; double val; CvFileNode* node = cvGetFileNodeByName( fs, pTN,name); if(node == NULL) continue; val = cvReadReal(node,defv); for(i=0; i<p->TransNum; ++i) { icvUpdateTrans( p->pTrans+i, param, val, p->pImg?(float)(p->pImg->width-1):1.0f, p->pImg?(float)(p->pImg->height-1):1.0f); } } /* Next record. */ else { /* Several transforms: */ int i0,i1; double v0; double v1; CvFileNode* pTN = (CvFileNode*)cvGetSeqElem(pTransSeq,0); v0 = cvReadRealByName(fs, pTN,name,defv); for(i1=1,i0=0; i1<KeyFrameNum; ++i1) { int f0,f1; int i; CvFileNode* pTN = (CvFileNode*)cvGetSeqElem(pTransSeq,i1); CvFileNode* pVN = cvGetFileNodeByName(fs,pTN,name); if(pVN)v1 = cvReadReal(pVN,defv); else if(pVN == NULL && i1 == KeyFrameNum-1) v1 = defv; else continue; f0 = KeyFrames[i0]; f1 = KeyFrames[i1]; if(i1==(KeyFrameNum-1)) f1++; for(i=f0; i<f1; ++i) { double val; double t = (float)(i-f0); int li = i - p->FrameBegin; if(li<0) continue; if(li>= p->TransNum) break; if(KeyFrames[i1]>KeyFrames[i0]) t /=(float)(KeyFrames[i1]-KeyFrames[i0]); val = t*(v1-v0)+v0; icvUpdateTrans( p->pTrans+li, param, val, p->pImg?(float)(p->pImg->width-1):1.0f, p->pImg?(float)(p->pImg->height-1):1.0f); } /* Next transform. */ i0 = i1; v0 = v1; } /* Next value run. */ } /* Several transforms. */ } /* Next parameter. */ } /* Next record. */ } /* More complex transform. */ } /* Read transfroms. */ return pElem; } /* icvTestSeqReadElemOne */
static CvTestSeqElem* icvTestSeqReadElemAll(CvTestSeq_* pTS, CvFileStorage* fs, const char* name) { CvTestSeqElem* pElem = NULL; CvFileNode* node; if(name == NULL) return NULL; node = cvGetFileNodeByName( fs, NULL, name ); if(node == NULL) { printf("WARNING!!! - Video %s does not exist!\n", name); return NULL; } printf("Read node %s\n",name); if(CV_NODE_IS_SEQ(node->tag)) { /* Read all element in sequence: */ int i; CvSeq* seq = node->data.seq; CvTestSeqElem* pElemLast = NULL; for(i=0; i<seq->total; ++i) { CvFileNode* next_node = (CvFileNode*)cvGetSeqElem( seq, i ); CvTestSeqElem* pElemNew = icvTestSeqReadElemOne(pTS, fs, next_node ); CvFileNode* pDurNode = cvGetFileNodeByName( fs, next_node,"Dur"); if(pElemNew == NULL ) { printf("WARNING in parsing %s record!!! Cannot read array element\n", name); continue; } if(pElem && pElemLast) { pElemLast->next = pElemNew; if(pDurNode) { pElemNew->FrameBegin = pElemLast->FrameBegin + pElemLast->FrameNum; } } else { pElem = pElemNew; } /* Find last element: */ for(pElemLast=pElemNew;pElemLast && pElemLast->next;pElemLast= pElemLast->next); } /* Next element. */ } /* Read all element in sequence. */ else { /* Read one element: */ pElem = icvTestSeqReadElemOne(pTS, fs, node ); } return pElem; } /* icvTestSeqReadElemAll */
/* ///////////////////// chess_corner_test ///////////////////////// */ void CV_ChessboardDetectorTimingTest::run( int start_from ) { int code = cvtest::TS::OK; /* test parameters */ std::string filepath; std::string filename; CvMat* _v = 0; CvPoint2D32f* v; IplImage img; IplImage* gray = 0; IplImage* thresh = 0; int idx, max_idx; int progress = 0; filepath = cv::format("%scv/cameracalibration/", ts->get_data_path().c_str() ); filename = cv::format("%schessboard_timing_list.dat", filepath.c_str() ); CvFileStorage* fs = cvOpenFileStorage( filename.c_str(), 0, CV_STORAGE_READ ); CvFileNode* board_list = fs ? cvGetFileNodeByName( fs, 0, "boards" ) : 0; if( !fs || !board_list || !CV_NODE_IS_SEQ(board_list->tag) || board_list->data.seq->total % 4 != 0 ) { ts->printf( cvtest::TS::LOG, "chessboard_timing_list.dat can not be readed or is not valid" ); code = cvtest::TS::FAIL_MISSING_TEST_DATA; goto _exit_; } max_idx = board_list->data.seq->total/4; for( idx = start_from; idx < max_idx; idx++ ) { int count0 = -1; int count = 0; CvSize pattern_size; int result, result1 = 0; const char* imgname = cvReadString((CvFileNode*)cvGetSeqElem(board_list->data.seq,idx*4), "dummy.txt"); int is_chessboard = cvReadInt((CvFileNode*)cvGetSeqElem(board_list->data.seq,idx*4+1), 0); pattern_size.width = cvReadInt((CvFileNode*)cvGetSeqElem(board_list->data.seq,idx*4 + 2), -1); pattern_size.height = cvReadInt((CvFileNode*)cvGetSeqElem(board_list->data.seq,idx*4 + 3), -1); ts->update_context( this, idx-1, true ); /* read the image */ filename = cv::format("%s%s", filepath.c_str(), imgname ); cv::Mat img2 = cv::imread( filename ); img = img2; if( img2.empty() ) { ts->printf( cvtest::TS::LOG, "one of chessboard images can't be read: %s\n", filename.c_str() ); code = cvtest::TS::FAIL_MISSING_TEST_DATA; continue; } ts->printf(cvtest::TS::LOG, "%s: chessboard %d:\n", imgname, is_chessboard); gray = cvCreateImage( cvSize( img.width, img.height ), IPL_DEPTH_8U, 1 ); thresh = cvCreateImage( cvSize( img.width, img.height ), IPL_DEPTH_8U, 1 ); cvCvtColor( &img, gray, CV_BGR2GRAY ); count0 = pattern_size.width*pattern_size.height; /* allocate additional buffers */ _v = cvCreateMat(1, count0, CV_32FC2); count = count0; v = (CvPoint2D32f*)_v->data.fl; int64 _time0 = cvGetTickCount(); result = cvCheckChessboard(gray, pattern_size); int64 _time01 = cvGetTickCount(); OPENCV_CALL( result1 = cvFindChessboardCorners( gray, pattern_size, v, &count, 15 )); int64 _time1 = cvGetTickCount(); if( result != is_chessboard ) { ts->printf( cvtest::TS::LOG, "Error: chessboard was %sdetected in the image %s\n", result ? "" : "not ", imgname ); code = cvtest::TS::FAIL_INVALID_OUTPUT; goto _exit_; } if(result != result1) { ts->printf( cvtest::TS::LOG, "Warning: results differ cvCheckChessboard %d, cvFindChessboardCorners %d\n", result, result1); } int num_pixels = gray->width*gray->height; float check_chessboard_time = float(_time01 - _time0)/(float)cvGetTickFrequency(); // in us ts->printf(cvtest::TS::LOG, " cvCheckChessboard time s: %f, us per pixel: %f\n", check_chessboard_time*1e-6, check_chessboard_time/num_pixels); float find_chessboard_time = float(_time1 - _time01)/(float)cvGetTickFrequency(); ts->printf(cvtest::TS::LOG, " cvFindChessboard time s: %f, us per pixel: %f\n", find_chessboard_time*1e-6, find_chessboard_time/num_pixels); cvReleaseMat( &_v ); cvReleaseImage( &gray ); cvReleaseImage( &thresh ); progress = update_progress( progress, idx-1, max_idx, 0 ); } _exit_: /* release occupied memory */ cvReleaseMat( &_v ); cvReleaseFileStorage( &fs ); cvReleaseImage( &gray ); cvReleaseImage( &thresh ); if( code < 0 ) ts->set_failed_test_info( code ); }
/* ///////////////////// chess_corner_test ///////////////////////// */ void CV_ChessboardDetectorTest::run( int start_from ) { int code = CvTS::OK; #ifndef WRITE_POINTS const double rough_success_error_level = 2.5; const double precise_success_error_level = 0.2; double err = 0, max_rough_error = 0, max_precise_error = 0; #endif /* test parameters */ char filepath[1000]; char filename[1000]; CvMat* _u = 0; CvMat* _v = 0; CvPoint2D32f* u; CvPoint2D32f* v; IplImage* img = 0; IplImage* gray = 0; IplImage* thresh = 0; int idx, max_idx; int progress = 0; sprintf( filepath, "%scameracalibration/", ts->get_data_path() ); sprintf( filename, "%schessboard_list.dat", filepath ); CvFileStorage* fs = cvOpenFileStorage( filename, 0, CV_STORAGE_READ ); CvFileNode* board_list = fs ? cvGetFileNodeByName( fs, 0, "boards" ) : 0; if( !fs || !board_list || !CV_NODE_IS_SEQ(board_list->tag) || board_list->data.seq->total % 2 != 0 ) { ts->printf( CvTS::LOG, "chessboard_list.dat can not be readed or is not valid" ); code = CvTS::FAIL_MISSING_TEST_DATA; goto _exit_; } max_idx = board_list->data.seq->total/2; for( idx = start_from; idx < max_idx; idx++ ) { int etalon_count = -1; int count = 0; CvSize etalon_size = { -1, -1 }; int j, result; ts->update_context( this, idx-1, true ); /* read the image */ sprintf( filename, "%s%s", filepath, cvReadString((CvFileNode*)cvGetSeqElem(board_list->data.seq,idx*2),"dummy.txt")); img = cvLoadImage( filename ); if( !img ) { ts->printf( CvTS::LOG, "one of chessboard images can't be read: %s", filename ); if( max_idx == 1 ) { code = CvTS::FAIL_MISSING_TEST_DATA; goto _exit_; } continue; } gray = cvCreateImage( cvSize( img->width, img->height ), IPL_DEPTH_8U, 1 ); thresh = cvCreateImage( cvSize( img->width, img->height ), IPL_DEPTH_8U, 1 ); cvCvtColor( img, gray, CV_BGR2GRAY ); sprintf( filename, "%s%s", filepath, cvReadString((CvFileNode*)cvGetSeqElem(board_list->data.seq,idx*2+1),"dummy.txt")); _u = (CvMat*)cvLoad( filename ); if( _u == 0 ) { if( idx == 0 ) ts->printf( CvTS::LOG, "one of chessboard corner files can't be read: %s", filename ); if( max_idx == 1 ) { code = CvTS::FAIL_MISSING_TEST_DATA; goto _exit_; } continue; } etalon_size.width = _u->cols; etalon_size.height = _u->rows; etalon_count = etalon_size.width*etalon_size.height; /* allocate additional buffers */ _v = cvCloneMat( _u ); count = etalon_count; u = (CvPoint2D32f*)_u->data.fl; v = (CvPoint2D32f*)_v->data.fl; OPENCV_CALL( result = cvFindChessBoardCornerGuesses( gray, thresh, 0, etalon_size, v, &count )); //show_points( gray, 0, etalon_count, v, count, etalon_size, result ); if( !result || count != etalon_count ) { ts->printf( CvTS::LOG, "chess board is not found" ); code = CvTS::FAIL_INVALID_OUTPUT; goto _exit_; } #ifndef WRITE_POINTS err = 0; for( j = 0; j < etalon_count; j++ ) { double dx = fabs( v[j].x - u[j].x ); double dy = fabs( v[j].y - u[j].y ); dx = MAX( dx, dy ); if( dx > err ) { err = dx; if( err > rough_success_error_level ) { ts->printf( CvTS::LOG, "bad accuracy of corner guesses" ); code = CvTS::FAIL_BAD_ACCURACY; goto _exit_; } } } max_rough_error = MAX( max_rough_error, err ); #endif OPENCV_CALL( cvFindCornerSubPix( gray, v, count, cvSize( 5, 5 ), cvSize(-1,-1), cvTermCriteria(CV_TERMCRIT_EPS|CV_TERMCRIT_ITER,30,0.1))); //show_points( gray, u + 1, etalon_count, v, count ); #ifndef WRITE_POINTS err = 0; for( j = 0; j < etalon_count; j++ ) { double dx = fabs( v[j].x - u[j].x ); double dy = fabs( v[j].y - u[j].y ); dx = MAX( dx, dy ); if( dx > err ) { err = dx; if( err > precise_success_error_level ) { ts->printf( CvTS::LOG, "bad accuracy of adjusted corners" ); code = CvTS::FAIL_BAD_ACCURACY; goto _exit_; } } } max_precise_error = MAX( max_precise_error, err ); #else cvSave( filename, _v ); #endif cvReleaseMat( &_u ); cvReleaseMat( &_v ); cvReleaseImage( &img ); cvReleaseImage( &gray ); cvReleaseImage( &thresh ); progress = update_progress( progress, idx-1, max_idx, 0 ); } _exit_: /* release occupied memory */ cvReleaseMat( &_u ); cvReleaseMat( &_v ); cvReleaseFileStorage( &fs ); cvReleaseImage( &img ); cvReleaseImage( &gray ); cvReleaseImage( &thresh ); if( code < 0 ) ts->set_failed_test_info( code ); }
void CvArrTest::print_time( int test_case_idx, double time_clocks ) { int in_type = -1, out_type = -1; CvSize size = { -1, -1 }; const CvFileNode* size_node = find_timing_param( "size" ); char str[1024], *ptr = str; int len; bool have_mask; double cpe; if( size_node ) { if( !CV_NODE_IS_SEQ(size_node->tag) ) { size.width = cvReadInt(size_node,-1); size.height = 1; } else { size.width = cvReadInt((const CvFileNode*)cvGetSeqElem(size_node->data.seq,0),-1); size.height = cvReadInt((const CvFileNode*)cvGetSeqElem(size_node->data.seq,1),-1); } } if( test_array[INPUT].size() ) { in_type = CV_MAT_TYPE(test_mat[INPUT][0].type); if( size.width == -1 ) size = cvGetMatSize(&test_mat[INPUT][0]); } if( test_array[OUTPUT].size() ) { out_type = CV_MAT_TYPE(test_mat[OUTPUT][0].type); if( in_type < 0 ) in_type = out_type; if( size.width == -1 ) size = cvGetMatSize(&test_mat[OUTPUT][0]); } if( out_type < 0 && test_array[INPUT_OUTPUT].size() ) { out_type = CV_MAT_TYPE(test_mat[INPUT_OUTPUT][0].type); if( in_type < 0 ) in_type = out_type; if( size.width == -1 ) size = cvGetMatSize(&test_mat[INPUT_OUTPUT][0]); } have_mask = test_array[MASK].size() > 0 && test_array[MASK][0] != 0; if( in_type < 0 && out_type < 0 ) return; if( out_type < 0 ) out_type = in_type; ptr = strchr( (char*)tested_functions, ',' ); if( ptr ) { len = (int)(ptr - tested_functions); strncpy( str, tested_functions, len ); } else { len = (int)strlen( tested_functions ); strcpy( str, tested_functions ); } ptr = str + len; *ptr = '\0'; if( have_mask ) { sprintf( ptr, "(Mask)" ); ptr += strlen(ptr); } *ptr++ = ','; sprintf( ptr, "%s", cvTsGetTypeName(in_type) ); ptr += strlen(ptr); if( CV_MAT_DEPTH(out_type) != CV_MAT_DEPTH(in_type) ) { sprintf( ptr, "%s", cvTsGetTypeName(out_type) ); ptr += strlen(ptr); } *ptr++ = ','; sprintf( ptr, "C%d", CV_MAT_CN(in_type) ); ptr += strlen(ptr); if( CV_MAT_CN(out_type) != CV_MAT_CN(in_type) ) { sprintf( ptr, "C%d", CV_MAT_CN(out_type) ); ptr += strlen(ptr); } *ptr++ = ','; sprintf( ptr, "%dx%d,", size.width, size.height ); ptr += strlen(ptr); print_timing_params( test_case_idx, ptr ); ptr += strlen(ptr); cpe = time_clocks / ((double)size.width * size.height); if( cpe >= 100 ) sprintf( ptr, "%.0f,", cpe ); else sprintf( ptr, "%.1f,", cpe ); ptr += strlen(ptr); sprintf( ptr, "%g", time_clocks/cvGetTickFrequency() ); ts->printf( CvTS::CSV, "%s\n", str ); }
CV_IMPL CvFileNode* cvGetFileNodeByName( const CvFileStorage* fs, const CvFileNode* _map_node, const char* str ) { CvFileNode* value = 0; int i, len, tab_size; unsigned hashval = 0; int k = 0, attempts = 1; if( !fs ) return 0; CV_CHECK_FILE_STORAGE(fs); if( !str ) CV_Error( CV_StsNullPtr, "Null element name" ); for( i = 0; str[i] != '\0'; i++ ) hashval = hashval*CV_HASHVAL_SCALE + (unsigned char)str[i]; hashval &= INT_MAX; len = i; if( !_map_node ) { if( !fs->roots ) return 0; attempts = fs->roots->total; } for( k = 0; k < attempts; k++ ) { CvFileNodeHash* map; const CvFileNode* map_node = _map_node; CvFileMapNode* another; if( !map_node ) map_node = (CvFileNode*)cvGetSeqElem( fs->roots, k ); if( !CV_NODE_IS_MAP(map_node->tag) ) { if( (!CV_NODE_IS_SEQ(map_node->tag) || map_node->data.seq->total != 0) && CV_NODE_TYPE(map_node->tag) != CV_NODE_NONE ) CV_Error( CV_StsError, "The node is neither a map nor an empty collection" ); return 0; } map = map_node->data.map; tab_size = map->tab_size; if( (tab_size & (tab_size - 1)) == 0 ) i = (int)(hashval & (tab_size - 1)); else i = (int)(hashval % tab_size); for( another = (CvFileMapNode*)(map->table[i]); another != 0; another = another->next ) { const CvStringHashNode* key = another->key; if( key->hashval == hashval && key->str.len == len && memcmp( key->str.ptr, str, len ) == 0 ) { value = &another->value; return value; } } } return value; }
CV_IMPL CvFileNode* cvGetFileNode( CvFileStorage* fs, CvFileNode* _map_node, const CvStringHashNode* key, int create_missing ) { CvFileNode* value = 0; int k = 0, attempts = 1; if( !fs ) return 0; CV_CHECK_FILE_STORAGE(fs); if( !key ) CV_Error( CV_StsNullPtr, "Null key element" ); if( _map_node ) { if( !fs->roots ) return 0; attempts = fs->roots->total; } for( k = 0; k < attempts; k++ ) { int i, tab_size; CvFileNode* map_node = _map_node; CvFileMapNode* another; CvFileNodeHash* map; if( !map_node ) map_node = (CvFileNode*)cvGetSeqElem( fs->roots, k ); CV_Assert(map_node != NULL); if( !CV_NODE_IS_MAP(map_node->tag) ) { if( (!CV_NODE_IS_SEQ(map_node->tag) || map_node->data.seq->total != 0) && CV_NODE_TYPE(map_node->tag) != CV_NODE_NONE ) CV_Error( CV_StsError, "The node is neither a map nor an empty collection" ); return 0; } map = map_node->data.map; tab_size = map->tab_size; if( (tab_size & (tab_size - 1)) == 0 ) i = (int)(key->hashval & (tab_size - 1)); else i = (int)(key->hashval % tab_size); for( another = (CvFileMapNode*)(map->table[i]); another != 0; another = another->next ) if( another->key == key ) { if( !create_missing ) { value = &another->value; return value; } CV_PARSE_ERROR( "Duplicated key" ); } if( k == attempts - 1 && create_missing ) { CvFileMapNode* node = (CvFileMapNode*)cvSetNew( (CvSet*)map ); node->key = key; node->next = (CvFileMapNode*)(map->table[i]); map->table[i] = node; value = (CvFileNode*)node; } } return value; }