OpenCV实践之路——画出时钟并动态同步系统时间
2017-11-21 08:11
681 查看
参考:http://blog.csdn.net/xingchenbingbuyu/article/details/50762351
本文并非原创,是在外网上看到的一个实例。原文参见Clock。不是翻译,也不是转载,只是自己实现了下,一点小记录。代码略有改动。
过程大致分为两步:第一步,画出时钟;第二步,同步系统时间。其中第一步是跟opencv相关,第二步不太了解,不作过多记录。
一个简单的时钟就是线段和圆的组合。包括最外围的圆,60根刻度线(其中12根整点刻度线)和时针分针秒针三根长的线段。
画圆最简单:创建一个长宽相等的图片,以图片中心为中心,以一半的图片长宽为半径画圆即可。
画线段就相对麻烦许多,因为一共要画60+12+3=75根线段。opencv的画线函数line()需要知道线段的起始点,而我们需要画的75根直线的起始点各不相同,我们需要一一计算出来。如果我们的圆是以我们数学上的笛卡尔坐标系的原点为中心,以r为半径画的圆,大概就是下面这样:
已知角度α的情况下我们可以很容易算到P点的坐标:
x = r * cos(α)
y = r * sin(α)
但是我们知道opencv中图像的坐标原点在左上角,那么我们可以变化下坐标系,得到下面的公式:
x = r + r * cos(α)
y = r + r * sin(α)
一分钟60秒,秒针刻度就是把外围的圆60等分,每两个刻度的夹角是6度。同理整点刻度就是把圆12等分,夹角为30度。
我们可以用半径相差不大的一大一小两个圆来算出每一根刻度线的起始点坐标,然后就可以用line()画出它们了。整点刻度同理。
画出刻度线之后获取系统时间,然后根据时间实时画出时针分针秒针。这一部分不太了解,就不多说了。代码如下:
本文并非原创,是在外网上看到的一个实例。原文参见Clock。不是翻译,也不是转载,只是自己实现了下,一点小记录。代码略有改动。
过程大致分为两步:第一步,画出时钟;第二步,同步系统时间。其中第一步是跟opencv相关,第二步不太了解,不作过多记录。
一个简单的时钟就是线段和圆的组合。包括最外围的圆,60根刻度线(其中12根整点刻度线)和时针分针秒针三根长的线段。
画圆最简单:创建一个长宽相等的图片,以图片中心为中心,以一半的图片长宽为半径画圆即可。
画线段就相对麻烦许多,因为一共要画60+12+3=75根线段。opencv的画线函数line()需要知道线段的起始点,而我们需要画的75根直线的起始点各不相同,我们需要一一计算出来。如果我们的圆是以我们数学上的笛卡尔坐标系的原点为中心,以r为半径画的圆,大概就是下面这样:
已知角度α的情况下我们可以很容易算到P点的坐标:
x = r * cos(α)
y = r * sin(α)
但是我们知道opencv中图像的坐标原点在左上角,那么我们可以变化下坐标系,得到下面的公式:
x = r + r * cos(α)
y = r + r * sin(α)
一分钟60秒,秒针刻度就是把外围的圆60等分,每两个刻度的夹角是6度。同理整点刻度就是把圆12等分,夹角为30度。
我们可以用半径相差不大的一大一小两个圆来算出每一根刻度线的起始点坐标,然后就可以用line()画出它们了。整点刻度同理。
画出刻度线之后获取系统时间,然后根据时间实时画出时针分针秒针。这一部分不太了解,就不多说了。代码如下:
#include <iostream> #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc_c.h" #include "opencv2/imgproc/imgproc.hpp" #include <stdio.h> #include <time.h> #include <sys/timeb.h> //#include <sys/time.h> #include<sys\utime.h> #include<math.h> using namespace std; using namespace cv; int main() { Mat clk(640, 640, CV_8UC3,Scalar(180,120,50)); //Mat to store clock image Mat back_up(640, 640, CV_8UC3, Scalar(180, 120, 50)); //Mat to store backup image Point cent(clk.rows/2, clk.cols/2); Point perim(clk.cols/2, 0); int rad = clk.cols / 2; float sec_angle = 270; float min_angle = 330; float hour_angle = 210; //画秒针刻度 vector<Point> pt1,pt2; for (int i = 0; i < 60; i++) { int x1 = cent.x + rad*cos(i * 6 * CV_PI / 180.0); int y1 = cent.y + rad*sin(i * 6 * CV_PI / 180.0); pt1.push_back(Point(x1, y1)); int x2 = cent.x + (rad - 20)*cos(i * 6 * CV_PI / 180.0); int y2 = cent.y + (rad - 20)*sin(i * 6 * CV_PI / 180.0); pt2.push_back(Point(x2, y2)); line(clk, pt1[i], pt2[i], Scalar(0, 255, 0, 0), 1.5, CV_AA, 0); } //画整点刻度 vector<Point> pt3,pt4; for (int i = 0; i < 12; i++) { int x3 = cent.x + (rad - 40)*cos(i * 30 * CV_PI / 180.0); int y3 = cent.y + (rad - 40)*sin(i * 30 * CV_PI / 180.0); pt3.push_back(Point(x3, y3)); line(clk, pt1[(i*5)], pt3[i], Scalar(0, 255, 0, 0), 5, CV_AA, 0); } //画最外围的圆和圆心的三针连接点 circle(clk, cent, rad, Scalar(50, 50, 255, 0), 6, CV_AA, 0); //Dreaw outercircle of clock circle(clk, cent, 2, Scalar(0, 255, 0, 0), 5, CV_AA, 0); //Draw inner circle back_up = clk.clone(); // Clone to backup image time_t rawtime; struct tm * timeinfo; float second; float minute; float hour; float millisec; struct timeb tmb; while (1){ //获取本地时间 ftime(&tmb); rawtime = tmb.time; timeinfo = localtime (&rawtime); second = timeinfo->tm_sec; minute = timeinfo->tm_min; hour = timeinfo->tm_hour; millisec = tmb.millitm; second = second + millisec / 1000; sec_angle = (second * 6) + 270; //Convert second to angle minute = minute + second / 60; min_angle = minute * 6 + 270; //Conver minute to angle if (hour>12)hour = hour - 12; hour_angle = (hour * 30) + (minute*.5) + 270; //Conver hour to angle if (sec_angle>360)sec_angle = sec_angle - 360; if (min_angle>360)min_angle = min_angle - 360; if (hour_angle>360)hour_angle = hour_angle - 360; //画秒针 perim.x = (int)cvRound(cent.x + (rad - 5) * cos(sec_angle * CV_PI / 180.0)); perim.y = (int)cvRound(cent.y + (rad - 5) * sin(sec_angle * CV_PI / 180.0)); line(clk, cent, perim, Scalar(0, 255, 255, 0), 1.5, CV_AA, 0); //画分针 perim.x = (int)cvRound(cent.x + (rad - 30) * cos(min_angle * CV_PI / 180.0)); perim.y = (int)cvRound(cent.y + (rad - 30) * sin(min_angle * CV_PI / 180.0)); line(clk, cent, perim, Scalar(0, 255, 255, 0), 4, CV_AA, 0); //画时针 perim.x = (int)cvRound(cent.x + (rad - 100) * cos(hour_angle * CV_PI / 180.0)); perim.y = (int)cvRound(cent.y + (rad - 100) * sin(hour_angle * CV_PI / 180.0)); line(clk, cent, perim, Scalar(0, 255, 255, 0), 12, CV_AA, 0); imshow("Clock", clk); //Show result in a window clk.setTo(0); // set clk image to zero for next drawing clk = back_up.clone(); // Clone the previously drawned markings from back-up image char c = waitKey(999); // 这里如果参数为10,则看到的是秒针连续地转动;如果是1000,则效果是秒针一秒一秒地跳动 if (c == 27)break; } return 0; }
相关文章推荐
- OpenCV实践之路——画出时钟并动态同步系统时间
- OpenCV—画出时钟并动态同步系统时间
- 网络时间同步系统(标准时间时钟显示屏)在医院网络系统的应用
- Linux 硬件时钟系统与系统时间的同步
- 【JavaScript】一个同步于本地时间的动态时钟并且自定义时间格式
- 天文时钟 高精度时间同步系统 GPS同步时钟 北斗同步时钟 CDMA同步时钟
- 使用线程 在shell上同步动态显示当前系统时间
- 高精度时间同步系统 CDMA同步时钟 CDMA卫星时钟 PC时间同步 XP时间同步 北京时间同步
- linux系统时间同步,硬件时钟和系统时间同步,时区的设置
- linux系统时间同步,硬件时钟和系统时间同步,时区的设置
- PHP日期时间函数date & time:如何显示系统当前时间与时钟同步
- linux系统时间同步,硬件时钟和系统时间同步,时区的设置
- 配置时间同步并将系统时间写入硬件时钟和配yum
- 高精度时间同步系统 北斗同步时钟 北斗卫星时钟 PC时间同步 XP时间同步 北京时间同步 北京时间校准 NTP服务器 时间服务器 时间同步服务器 北斗授时系统 北斗对时系统 北斗时间服务器 北斗对时装置
- linux 修改系统时间并同步到硬件时钟
- GDI绘制时钟效果,与系统时间保持同步,基于Winform
- C# NTP 时钟同步,获取指定IP地址的系统时间及错误问题解决。
- ubuntu修改时间、显示硬件时间、同步系统时钟(date命令使用方法)
- 天文时钟 高精度时间同步系统 GPS同步时钟 北斗同步时钟 CDMA同步时钟
- Linux之系统日志,时间同步