前言
在本篇中,将利用绘图函数,学习如何在实战项目中使用绘图,绘制模拟时钟显示当前时间。
模拟时钟外观
结合OpenCV中的绘图函数(例如,cv2.line()、cv2.circle()和cv2.putText()等),以渲染更高级的绘图,同时更好的理解和实际运用所了解的绘图函数。为了将所有绘图函数进行综合运用,构建一个模拟时钟来显示当前时间——包括时针、分针和秒针。
为了实现上述需求,编写clock_appearance.py脚本。clock_appearance.py脚本使用cv.line()、cv.circle()和cv2.putText()绘制模拟时钟,首先绘制静态时钟外观,我们需要两个包含固定坐标的数组(至于这些数组是如何计算得到的,将在下一小节中介绍):
hours_orig = np.array([(620,320), (580,470), (470,580), (320,620), (170,580), (60,470), (20,320), (60,170), (169,61), (319,20), (469,60), (579,169)])
hours_dest = np.array([(600,320), (563,460), (460,562), (320,600), (180,563), (78,460), (40,320), (77,180), (179,78), (319,40), (459,77), (562,179)])
这些数组是渲染小时刻度所必需的,因为它们定义了时钟每小时的刻度线条。数组定义完成后,将这些刻度进行绘制:
foriinrange(0,12): cv2.line(image, array_to_tuple(hours_orig[i]), array_to_tuple(hours_dest[i]), colors['black'],3)
此外,还应该绘制了一个大圆圈,对应于模拟时钟表盘的形状:
cv2.circle(image, (320, 320), 310, colors['black'], 8)
最后,在时钟内绘制文本,进行个性化定制:
一旦在图像中绘制了这些静态信息,我们将其复制到 image_original 图像中:
image_original = image.copy()
在下图中,可以看到模拟时钟的外观:
计算时针刻度 hours_orig 和 hours_dest 数组
为了计算计算时针刻度hours_orig和hours_dest数组,我们编写clock_hours.py计算hours_orig和hours_dest数组的固定坐标。为了计算小时刻度的 (x, y) 坐标,我们使用圆的参数方程:
按照上述公式计算从 0 度开始每隔 30 度为一个时针刻度,共 12 个点P(x, y)的坐标(0、30、60、90、120、150、180、210、240、270、300和330),为了获取两个端点的坐标,我们具有两个不同的半径。这样,我们就可以得到时针刻度线的坐标:
使用模拟时钟显示当前时间
得到表盘外观后,接下来就要使用模拟时钟显示当前时间:
1.从当前时间获取小时、分钟和秒:
2.将时、分和秒都转换为角度,用于接下来指针线段的绘制:
3.绘制与时针、分针和秒针对应的线段:
4.最后绘制一个小圆圈作为三根指针的连接点:
cv2.circle(image, (320,320),10, colors['dark_gray'], -1)
运行代码可以看到绘制的模拟时钟可以正确显示当前时间: