前言

昨天在我的博客中已经做了一个用python-OpenCV实现魔方墙找茬 的程序,具体可查看https://blog.csdn.net/FujLiny/article/details/109494251

现在在第1版的基础上,加上分值计算、倒计时、记录存储三部分功能。这篇文章主要讲解一下倒计时的效果该如何做出来。
先展示一下最终的效果:

为了达到更有趣味性,设置了游戏规则:
初始时间为36秒,找到一个小方块时间加2.3秒,
根据设置的小方块尺寸和数量不同,单次分数计算规则:方块数量 * (1080/单个方块宽度)


程序实现过程

这里主要分析一下如何把时间和分值实时地显示在图像上,其他的内容可自行阅读代码进行修改、分析。

OpenCV有一个putText()函数,可以在图像上添加文本内容,利用此函数就可以把倒计时和分数写在图像上进行显示。

程序实现过程如下:

  1. 创建一个黑色背景并覆盖在图像中间的黑色区域
  2. 把文本内容–倒计时和分数 添加到图像上
  3. 等待20毫秒 waitKey(20)
  4. 回到第1步执行

1.创建一个黑色画布并覆盖在图像中间的黑色区域

# self.height 画布的高度
# self.interval 左右画布中间黑色区域的间距
self.imgInterval = np.zeros((self.height, self.interval,3), 'uint8')
self.img[0:self.height, self.height:self.height + self.interval] = self.imgInterval


就是在上图橙色箭头的那一个黑色区域,创建的黑色画布的尺寸也必须刚好就是那一块区域的大小,否则会遮盖掉旁边的颜色块。

有些人可能会疑问,为什要创建这个黑色画布去覆盖原来的黑色背景?不是多此一举吗?
这一步当然是重要的步骤,如果不这样做的话,那么接下来的步骤中,每次在图像上写入的文本就会重叠在上一个文本上面。

2.把文本内容–倒计时和分数 添加到图像上

这里对先 putText() 函数的参数进行解释一下:

# 关于 putText() 函数的定义
def putText(img, text, org, fontFace, fontScale, color, thickness=None, lineType=None, bottomLeftOrigin=None)

img:要显示的GUI窗口
text:要写入图像的文本内容
org:写入的位置 (x, y)
fontFace:字体样式 (OpenCV自带有几种字体样式,例如 cv.FONT_HERSHEY_SIMPLEX)
fontScale:字体大小
color:颜色 (r,g,b)
thickness:线条的宽度
lineType:线条类型(lineType = cv.LINE_AA可以有抗锯齿的效果)
bottomLeftOrigin:如果为True,文字从右往左写,如果为False,文字从左往右写。

在执行 putText() 函数之前,先定义字体样式和字体大小:

self.font = cv.FONT_HERSHEY_SIMPLEX
self.fontsize = self.interval / 120
self.fontsize = 0.5 if len(str(self.score)) > 5 else self.fontsize
self.fontsize = 0.45 if len(str(self.score)) > 6 else self.fontsize
# 字体大小 fontsize为什么要这么定义,读者朋友可以不用太在意。
# len(str(self.score))是对要分数这个文本内容进行长度判断,
# 如果长度超过5位数或6位数的话,就要缩小一点字体的大小,否则可能会超出中间的黑色区域

执行 putText() 函数,在图像上写入文本:

# self.score 分数      timeRemain 倒计时
cv.putText(self.img, str(self.score), self.org, self.font, self.fontsize, (255, 255, 255), 1, cv.LINE_AA,False)
cv.putText(self.img, str(timeRemain), self.org_2, self.font, self.fontsize, (255, 255, 255), 1, cv.LINE_AA,False)

现在就成功地在图像上写入文本内容了

3. 等待20毫秒 waitKey(20)

等待20毫秒后,回到第一步重新用黑色画布覆盖在中间的黑色区域,继续往图像上添加文本,就可以实现倒计时的效果了。

while True:self.img[0:self.height, self.height:self.height + self.interval] = self.imgIntervalself.fontsize = 0.5 if len(str(self.score)) > 5 else self.fontsizeself.fontsize = 0.45 if len(str(self.score)) > 6 else self.fontsizecv.putText(self.img, str(self.score), self.org, self.font, self.fontsize, (255, 255, 255), 1, cv.LINE_AA)cv.putText(self.img, str(timeRemain), self.org_2, self.font, self.fontsize, (255, 255, 255), 1, cv.LINE_AA,False)cv.imshow('img', self.img)if cv.waitKey(20) == 13 or timeRemain <= 0:break

数据存储

这个2.0版本还增加了对每次的数据进行存储,每次获得的分数记录都会被存储下来,这里采用json文件进行存储,具体存储过程就不展开讲述了,可以自行查看源代码,这里简单对json文件的结构说明一下。

当倒计时结束后就会对分数进行存储,根据时间、方块数量、方块尺寸、单次的分值等进行存储,也会对最高分、排名前二十、每一次刷新的最高分进行存储。

总结

这个版本主要是完善了在图像上显示倒计时的功能,如果大家要用OpenCV制作一段文本变换的视频不妨可以参考这个方式。

下载代码

程序源代码已经上传,点击下载:https://download.csdn.net/download/FujLiny/13090460

用python-OpenCV做一个魔方墙找茬程序(3D视眼训练) 版本2.0:加入倒计时功能相关推荐

  1. 用python-OpenCV做一个魔方墙找茬 (3D视眼训练)

    前言 相信有些朋友接触过魔方墙找茬这类游戏,在两边对照的众多颜色块中找到其中一个不同的颜色块,有些人会用来训练3D视眼,那么就来做一个魔方墙找茬的程序吧. 本次采用OpenCV来制作,用到了基础库Nu ...

  2. 《最强大脑:魔方墙找茬王郑才千的学神秘笈-郑才千》-读书笔记

    读完这本书,惊觉这就是我一直苦苦寻找的学霸学习法吗?但作者说他不是学霸,是学神!!

  3. python制作聊天机器人原理_用 Python 来做一个聊天机器人吧!(一)

    在我的一个回答里,我提到了用 Python 搭建聊天机器人.从今天开始,我就带着大家从0开始搭建一个聊天机器人. (顺便说一句,我喜欢把链接像上面这样加在文字里,如果找不到文中所说的资源,可以看看周围 ...

  4. [css] 使用css3做一个魔方旋转的效果

    [css] 使用css3做一个魔方旋转的效果 总的来说,用了一些 3D 效果的样式,如 translate3d,rotate3d,perspective,transform-style: preser ...

  5. python屏幕录制与回放_使用Python来做一个屏幕录制工具的操作代码

    本文给大家分享使用Python来做一个屏幕录制工具,通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 一.写在前面 作为一名测试,有时候经常会遇到需要录屏记录自己操作,方 ...

  6. 脚本录制软件python 按键精灵 tc_使用Python来做一个屏幕录制工具的操作代码

    一.写在前面 作为一名测试,有时候经常会遇到需要录屏记录自己操作,方便后续开发同学定位.以前都是用ScreenToGif来录屏制作成动态图,偶尔的机会看到python也能实现.那就赶紧学习下. 二.效 ...

  7. Python脚本做一个淘宝秒杀程序!

    Python脚本做一个淘宝秒杀程序! 先上代码 from selenium import webdriver import datetime import time import os import ...

  8. 初学者笔记(四):做一个体重指数BMI的小程序

    系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 初学者笔记(三):利用python列表做一个最简单的垃圾分类 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮 ...

  9. 如何复制java卡,使用java做一个简单的集卡程序

    使用java做一个简单的集卡程序 本次设想的是要集齐4张卡,每张卡的概率都是25%,如果每个用户集齐需要多少次才能集合完毕 public class Test { public static void ...

最新文章

  1. HDU 5112 A Curious Matt 水题
  2. logstash mysql日期_logstash-input-jdbc取mysql数据日期格式处理
  3. List精讲(Java版)·算法常用集合处理方法
  4. P1463-[POI2002][HAOI2007]反素数【约数,数论】
  5. linux脚本编写规则,shell脚本编写守则
  6. 项目管理最佳实践方法_项目管理最佳实践,企业如何进行有效的项目管理
  7. 活动选择(信息学奥赛一本通-T1323)
  8. 高级排序之快速排序(分割与整合)
  9. 使用组策略禁止域用户运行特定软件名称的程序
  10. oracle java vm,我可以使用Oracle Java 7 HotSpot VM安装DCEVM吗?
  11. 人脸识别+检索项目记录
  12. 荔枝hsv空间图像分割程序matlab,基于稀疏场水平集的荔枝图像分割算法_毛亮
  13. Spring AOP 实现用户权限验证
  14. 破解版软件-20131014更新
  15. 美通企业日报 | 安踏上半年收入突破148亿元劲增超40%;猎聘8亿元战略投资问卷星...
  16. 计算机组成原理实验二八位寄存器,计算机组成原理课后参考答案
  17. win7锁屏壁纸更改方法 win7怎么设置锁屏壁纸
  18. 打字机效果的实现与应用
  19. Verilog求相反数
  20. 【论文阅读】The Devil is in the Channels: Mutual-Channel Loss for Fine-Grained Image Classification

热门文章

  1. matlab simulink 车辆能耗_[Lib库 1]CoppeliaSim差分避障小车的Simulink实现
  2. 怎么把英语视频转为音频 怎么把MP4转换成mp3
  3. oracle字符串类型的时间常用操作
  4. 大学计算机应用教程马秀麟,马秀麟
  5. Infocom 2020 论文快读
  6. JDK 8 新特性之接口详解
  7. 【操作系统】30天自制操作系统--(27)文件操作
  8. Visual studio中.sln、.ncb、.rc、.sdf、.def、.vcproj等后缀文件解释
  9. JavaScript实现环形图echarts
  10. 通达信交易系统接口是不是免费的?