首页 > 代码库 > opencv函数制作的时钟模型

opencv函数制作的时钟模型

http://www.cnblogs.com/sytu/p/4192652.html

在秒针模型的基础上添加了分针和时针,并且添加了暂停控件和设置时间的功能。

  1 #include"cv.h"  2 #include"highgui.h"  3 int run = 1;  4 void Stop_Run_onclick(int event,int x,int y,int flags,void* param)  5 {  6     switch (event)  7     {  8     case CV_EVENT_LBUTTONDOWN:{  9                                   if (x<330 && x>170 && y<110 && y>80) 10                                   { 11                                       run = !run; 12                                     } 13     } 14     default: 15         break; 16     } 17 } 18 void Drwan_button(IplImage* plane) 19 { 20     //画按钮 21     cvRectangle(plane, cvPoint(170, 80), cvPoint(330, 110), cvScalar(100, 100, 100), 2); 22     cvSetImageROI(plane, cvRect(170, 80, 160, 30)); 23     cvZero(plane); 24     cvFloodFill(plane,cvPoint(0,0),cvScalarAll(100),cvScalarAll(0)); 25     cvResetImageROI(plane); 26     if (run) 27     cvPutText(plane, "StopTime", cvPoint(173, 105), &cvFont(2, 2), cvScalar(100, 0, 100)); 28     else 29     { 30         cvPutText(plane, "RunTime", cvPoint(173, 105), &cvFont(2, 2), cvScalar(100, 0, 100)); 31     } 32 } 33 double PIZHI(int count) 34 { 35     return 2*(1.0*count / 60.0 * 3.1415926); 36 } 37 int main() 38 { 39     IplImage* Plane = cvCreateImage(cvSize(500,500),8,3); 40     cvAddS(Plane,cvScalar(100,0,200),Plane); 41     cvCircle(Plane,cvPoint(250,250),100,cvScalar(0,180,0),2); 42     cvPutText(Plane,"12",cvPoint(236,145),&cvFont(1,1),cvScalar(50,150,10)); 43     cvPutText(Plane, "3", cvPoint(355, 255), &cvFont(1, 1), cvScalar(50, 150, 10)); 44     cvPutText(Plane, "4", cvPoint(340, 305), &cvFont(1, 1), cvScalar(50, 150, 10)); 45     cvPutText(Plane, "5", cvPoint(312, 345), &cvFont(1, 1), cvScalar(50, 150, 10)); 46     cvPutText(Plane, "6", cvPoint(250, 365), &cvFont(1, 1), cvScalar(50, 150, 10)); 47     cvPutText(Plane, "7", cvPoint(188, 347), &cvFont(1, 1), cvScalar(50, 150, 10)); 48     cvPutText(Plane, "8", cvPoint(153, 310), &cvFont(1, 1), cvScalar(50, 150, 10)); 49      50     cvPutText(Plane, "9", cvPoint(135, 255), &cvFont(1, 1), cvScalar(50, 150, 10)); 51     cvPutText(Plane, "10", cvPoint(140, 200), &cvFont(1, 1), cvScalar(50, 150, 10)); 52     cvPutText(Plane, "11", cvPoint(175, 165), &cvFont(1, 1), cvScalar(50, 150, 10)); 53     cvPutText(Plane, "1", cvPoint(300, 160), &cvFont(1, 1), cvScalar(50, 150, 10)); 54     cvPutText(Plane, "2", cvPoint(340, 195), &cvFont(1, 1), cvScalar(50, 150, 10)); 55     cvCircle(Plane,cvPoint(250,250),3,cvScalarAll(50),4); 56     cvNamedWindow("Clock"); 57     cvSetMouseCallback("Clock",Stop_Run_onclick,0); 58     Drwan_button(Plane); 59     cvShowImage("Clock",Plane); 60     IplImage* img = cvCreateImage(cvGetSize(Plane),8,3); 61     double dangle = 0.1036; 62     int r = 100; 63     int x = 250, y = 250;//圆心 64     int count_s = 0; 65     int count_m = 0; 66     int x1, x2; 67     //for seconds 68     double angle = 0; 69     int dx = 0; 70     int dy = 0; 71     //for minutes 72     double angle_m = 0; 73     int mx = 0; 74     int my = 0; 75     //for hours 76     double angle_h = 0; 77     int hx=0, hy = 0; 78     int count_h = 0; 79     //设置时钟输入调节 80     //angle; 81     //angle_m; 82     //angle_h; 83     //count_m; 84     //count_s; 85     printf("\t\t\t选项\n\t\t\t从零点开始走针(1)\n\t\t\t从历史记录的时间走针(2)\n\t\t\t输入选项:"); 86     int judge; 87     scanf("%d", &judge); 88     if (judge == 2){ 89         FILE *file = fopen("TimeRecord.dat", "r"); 90         fscanf(file, "%lf %lf %lf %d %d %d", &angle_h, &angle_m, &angle, &count_h, &count_m, &count_s); 91         fclose(file); 92     } 93     system("cls"); 94     printf("按下ESC键可以退出!\n"); 95     printf("Enter键或者屏幕按键可以暂停钟表转动\n"); 96     printf("按下空格键可以设置时间:(输入格式为00:00:00)\n"); 97      98     while (true) 99     {100         if (run){101             cvCopy(Plane, img);102             dy = r * cos(angle);103             dx = r * sin(angle);104             //for seconds105             my = r * cos(angle_m);106             mx = r * sin(angle_m);107             //for hours108             hx = r * sin(angle_h);109             hy = r * cos(angle_h);110             count_s++;111             angle=PIZHI(count_s);112             cvLine(img, cvPoint(x, y), cvPoint(x + hx / 2, x - hy / 2), cvScalar(100, 0, 250), 3);113             cvLine(img, cvPoint(x, y), cvPoint(x + mx / 1.5, y - my / 1.5), cvScalar(10, 90, 50), 2);114             cvLine(img, cvPoint(x, y), cvPoint(x + dx, y - dy), cvScalar(100, 90, 0), 1);115             116             if (count_s == 60||judge==10)117             {118                 if (judge!=10)119                 count_s = 0;120                 count_m++;121                 angle = 0;122                 angle_m=PIZHI(count_m);123                 if (count_m % 12 == 0||judge==10){124                     count_h++;125                     angle_h = PIZHI(count_h);126                     if (count_h == 60)count_h = 0;127                 }128                 if (count_m == 60)count_m = 0;129                 judge = 0;130             }131         }132         Drwan_button(img);133         cvShowImage("Clock", img);134         135         char ch = cvWaitKey(1000);136         if (ch == 27)137         {138             FILE* write = fopen("TimeRecord.dat","w");139             fprintf(write, "%lf %lf %lf %d %d %d", angle_h, angle_m, angle, count_h, count_m, count_s);140             fclose(write);141             break;142         }143         else if (ch==13)144         {145             run = !run;146         }147         else if (ch == 32)148         {149             scanf("%d:%d:%d",&count_h,&count_m,&count_s);150             count_h=count_h * 5 + 1.0*count_m / 12.0;151             judge = 10;152         }153     }154     cvWaitKey(0);155     return 0;156 }

做着挺好玩的,就当练练手吧。

 

opencv函数制作的时钟模型