double cal_line_len (double xpos[], double ypos[]) { double len; int i; for (i = 0; i < POINT_NUMBER - 1; i++) { len += cal_dist (xpos[i], ypos[i], xpos[i + 1], ypos[i + 1]); } return len; }
int main() { int size, i, j; int now, next, min, costs; while(scanf("%d", &size) != EOF){ if(size == 0) break; for(i = 0; i < size; i++){ scanf("%s", str[i]); for(j = 0; j <= i; j++){ dist[i][j] = cal_dist(str[i], str[j]); dist[j][i] = dist[i][j]; } edge[i] = 10; } edge[0] = -1; now = 0; costs = 0; for(i = 1; i < size; i++){ min = 10; // for now for(j = 0; j < size; j++){ if(edge[j] >= 0){ if(edge[j] > dist[now][j]) edge[j] = dist[now][j]; if(edge[j] < min){ min = edge[j]; next = j; } } } costs += min; now = next; edge[now] = -1; } printf("The highest possible quality is 1/%d.\n", costs); } return 0; }
int main() { /*读配置文件*/ FILE* fp; char readin[100],file[100]; int value1=0, value2=0, value3=0,value4=0,value5=0; fopen_s(&fp, "configure/configure.txt", "r"); fscanf_s(fp, "video: %s", readin, sizeof(readin)); sprintf(file, readin); memset(readin, 0, sizeof(readin)); fgets(readin, sizeof(readin),fp); fscanf_s(fp, "value1: %d", &value1, sizeof(int)); memset(readin, 0, sizeof(readin)); fgets(readin, sizeof(readin), fp); fscanf_s(fp, "value2: %d", &value2, sizeof(int)); memset(readin, 0, sizeof(readin)); fgets(readin, sizeof(readin), fp);; fscanf_s(fp, "value3: %d", &value3, sizeof(int)); memset(readin, 0, sizeof(readin)); fgets(readin, sizeof(readin), fp); fscanf_s(fp, "value4: %d", &value4, sizeof(int)); memset(readin, 0, sizeof(readin)); fgets(readin, sizeof(readin), fp); fscanf_s(fp, "value5: %d", &value5, sizeof(int)); printf("%s %d %d %d\n", file,value1,value2,value3); /*声明IplImage指针*/ IplImage *image0 = NULL; //原始帧 IplImage *image = NULL; //当前帧 IplImage *image_pass = NULL; //上一帧 IplImage *res = NULL; //帧差 IplImage *res0 = NULL; //帧差 IplImage *pFrame = NULL; IplImage *pFrImg = NULL; IplImage *pBkImg = NULL; /*声明CvMat指针*/ CvMat* pFrameMat = NULL; CvMat* pFrMat = NULL; CvMat* pBkMat = NULL; CvMat* IndexMat = NULL; /*声明caputer指针*/ CvCapture *capture = NULL; capture = cvCaptureFromFile(file); image0 = cvQueryFrame(capture); nFrmNum++; // 创建窗口 //cvNamedWindow("video", 1); cvNamedWindow("background", 1); cvNamedWindow("tracking", 1); // 排列窗口 //cvMoveWindow("video", 30, 80); cvMoveWindow("background",10, 100); cvMoveWindow("tracking", 660, 100); /*移动物体的队列*/ movingObject *curr_head = new movingObject(); movingObject *prev_head = new movingObject(); movingObject *p_obj = new movingObject(); movingObject *share_head = new movingObject(); curr_head->next = NULL; curr_head->share_next = NULL; prev_head->next = NULL; prev_head->share_next = NULL; share_head->next = NULL; CvScalar color[7] = { { 0, 0, 0 }, { 0, 255, 0 }, {255, 0, 0 }, { 255, 201, 14 }, { 255, 0, 255 }, { 0, 166, 0 }, {121,255,121} }; image = cvCreateImage(cvSize(640,360), IPL_DEPTH_8U, 3); cvResize(image0, image, CV_INTER_LINEAR); int image_width = image->width; int image_height = image->height; image_pass = cvCreateImage(cvSize(image_width, image_height), IPL_DEPTH_8U, 3); res = cvCreateImage(cvSize(image_width, image_height), IPL_DEPTH_8U, 1); res0 = cvCreateImage(cvSize(image_width, image_height), IPL_DEPTH_8U, 3); pBkImg = cvCreateImage(cvSize(image_width, image_height), IPL_DEPTH_8U, 1); pFrImg = cvCreateImage(cvSize(image_width, image_height), IPL_DEPTH_8U, 1); pFrame = cvCreateImage(cvSize(image_width, image_height), IPL_DEPTH_8U, 1); pBkMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1); pFrMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1); pFrameMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1); IndexMat = cvCreateMat(image_height, image_width, CV_32FC1); cvCopy(image, image_pass, NULL); /*背景*/ cvCvtColor(image, pBkImg, CV_BGR2GRAY); cvConvert(pBkImg, pBkMat); while (1) { image0 = cvQueryFrame(capture); if (!image0) break; cvResize(image0, image, CV_INTER_LINEAR); /*高斯平滑*/ cvSmooth(image, image, CV_GAUSSIAN, 3, 0, 0); /*运动目标检测*/ detect_object(image, pBkImg, pFrImg, pFrameMat, pBkMat, pFrMat,value1); /*帧差法优化*/ frame_dif(image, image_pass, res,res0, pFrImg,pFrame,value2); cvConvert(pFrame, pFrMat); /*计算连通区域和质心*/ computeObject(pFrMat, image_width, image_height,IndexMat, curr_head,value3); /*画出质心*/ p_obj = curr_head; while (p_obj->next != NULL) { p_obj = p_obj->next; cvRectangle(image, cvPoint(p_obj->x - 1, p_obj->y - 1), cvPoint(p_obj->x + 1, p_obj->y + 1), cvScalar(0, 0, 255), 2, 8, 0); } if (nFrmNum == 2) { movingObject* q = NULL; computeObject(pFrMat, image_width, image_height, IndexMat, prev_head,value3); } /*画出跟踪框*/ if (nFrmNum > 2) { movingObject *q = NULL, *p = NULL; movingObject *last=curr_head; for (q = curr_head->next; q; ) { int close = 0; share_head->share_next = NULL; for (p = prev_head->next; p; p = p->next) { int dist = cal_dist(p->x, p->y, q->x, q->y); if (dist <= value5) { close++; p->share_next = share_head->share_next; share_head->share_next= p; } } if (close == 1) { if (share_head->share_next->track == 1) //已被用,删掉当前结点 { last->next = q->next; movingObject* t=q; q = q->next; delete t; continue; } q->label = (share_head->share_next)->label; cvRectangle(image, q->points[0], q->points[1], color[q->label],2); q->move = q->x - (share_head->share_next)->x; //两帧位移 share_head->share_next->track = 1; q->track = 0; q->keeptime = 0; last = q; q = q->next; } else if (close==0) { //生成新标签 q->label = ++label_num; cvRectangle(image, q->points[0], q->points[1], color[q->label],2); q->track = 0; q->keeptime = 0; last = q; q = q->next; } else if (close>1) { movingObject* t = share_head->share_next; while ( t != NULL) { if (t->track==1) t = t->share_next; else break; } if (t==NULL) //全部跟踪完毕 { last->next = q->next; t = q; q = q->next; delete t; continue; } //重用当前队列的这一object q->label = t->label; q->move = t->move; q->area = t->area; q->x = t->x + t->move; q->y = t->y; q->points[0].x = t->points[0].x+t->move; q->points[0].y = t->points[0].y; q->points[1].x = t->points[1].x + t->move; q->points[1].y = t->points[1].y; q->track = 0; t->track = 1; q->keeptime = 0; cvRectangle(image, q->points[0], q->points[1], color[q->label],2); t = t->share_next; while (t) { if (t->track == 1) { t = t->share_next; continue; } movingObject* newobject = new movingObject(); newobject->area = t->area; newobject->label = t->label; newobject->move = t->move; newobject->next = q->next; q->next = newobject; q = newobject; newobject->points[0].x = t->points[0].x + t->move; newobject->points[0].y = t->points[0].y; newobject->points[1].x = t->points[1].x + t->move; newobject->points[1].y = t->points[1].y; newobject->x = t->x + t->move; newobject->y = t->y; newobject->track = 0; newobject->keeptime = 0; cvRectangle(image, newobject->points[0], newobject->points[1], color[newobject->label],2); t->track = 1; //已跟踪这一个prev目标 t = t->share_next; } last = q; q = q->next; } }//end for detect_hiding(prev_head, image_width, curr_head,value4); }//end if cvShowImage("tracking", image); release_link(prev_head,share_head); prev_head->next = curr_head->next; curr_head->next = NULL; int ctrl; if ( (ctrl=cvWaitKey(20)) == 27)//ESC退出 { break; } else if (ctrl == 32) //空格暂停 { while ((ctrl=cvWaitKey(0))!=13)//回车继续 { if (ctrl == 27) exit(0); continue; } } } cvReleaseImage(&res); cvReleaseImage(&res0); cvReleaseImage(&image_pass); cvReleaseImage(&pBkImg); cvReleaseImage(&pFrImg); cvReleaseImage(&pFrame); cvReleaseCapture(&capture); return 1; }