【OpenCV】仿 IOS 锁屏时钟

OpenCV 是一个开源的计算机视觉(Computer Vision)与机器学习软件库,提供了多种图像处理算法与接口。在图像处理中,按位运算是一类重要的运算,可以用于提取图像的重要部分。本文主要记录如何使用 OpenCV-Python 绘制仿 IOS 的锁屏时钟。

目录

1 函数介绍

2 程序设计


1 函数介绍

        在图像处理中,按位运算是一类重要的运算。OpenCV 提供了以下 4 种按位运算,包括:

  • cv2.bitwise_and()
  • cv2.bitwise_or()
  • cv2.bitwise_xor()
  • cv2.bitwise_not()

另外,按位运算可以配合图像掩膜使用,用于提取图像中的重要部分。

cv2.bitwise_and() 函数用法:

Syntax: cv2.bitwise_and(source1, source2, destination, mask)

cv2.bitwise_or() 函数用法:

Syntax: cv2.bitwise_or(source1, source2, destination, mask)

cv2.bitwise_xor() 函数用法:

Syntax: cv2.bitwise_xor(source1, source2, destination, mask)

cv2.bitwise_not() 函数用法:

Syntax: cv2.bitwise_not(source, destination, mask)

  • source:输入图像,支持单通道、8bit 或浮点数格式;
  • destination:输出图像,大小与格式需与 source 保持一致;
  • mask:运算掩码,格式为8bit 单通道。

2 程序设计

以下是 Python 代码:

#-*- Coding: utf-8 -*-
import cv2
import numpy as np
from datetime import datetimenum_mask = {n: cv2.imread(f'./src/{n}.PNG', cv2.IMREAD_GRAYSCALE) for n in range(10)}def draw_number(image, slice, iy, ix):# 根据ix,iy坐标放置数字slice_ext = np.zeros(image.shape, dtype=np.uint8)slice_ext[iy: iy+slice.shape[0], ix: ix+slice.shape[1]] = slice# 使用cv2.bitwise_or()函数叠加dst_img = cv2.bitwise_or(image, slice_ext)return dst_imgdef draw_clock(image, current):# 创建纯色图像height, width, channel = 1179, 960, 3color_light = np.zeros((height, width, channel), dtype=np.uint8)color_light[:] = (0xFA, 0xC5, 0x51) # in BGR modecolor_deep = np.zeros((height, width, channel), dtype=np.uint8)color_deep[:] = (0xBA, 0x62, 0x00) # in BGR mode# 使用cv2.bitwise_and()函数给数字上色hour_slice1 = cv2.bitwise_and(color_deep, color_deep, mask=num_mask[current.hour // 10])hour_slice2 = cv2.bitwise_and(color_light, color_light, mask=num_mask[current.hour % 10])minute_slice1 = cv2.bitwise_and(color_deep, color_deep, mask=num_mask[current.minute // 10])minute_slice2 = cv2.bitwise_and(color_light, color_light, mask=num_mask[current.minute % 10])# 绘制时间col_min = (image.shape[0]-height)//2row_min = (image.shape[1]-width)//6image = draw_number(image, hour_slice1, col_min, row_min)image = draw_number(image, hour_slice2, col_min, row_min+image.shape[1]//8)image = draw_number(image, minute_slice1, col_min, row_min+image.shape[1]//8*3)image = draw_number(image, minute_slice2, col_min, row_min+image.shape[1]//8*4)return imagedef main():# 新建背景图像row, col, channel = 2160, 3840, 3img_bg = np.zeros(shape=(row, col, channel), dtype=np.uint8)# 创建窗口,并设置属性cv2.namedWindow('win', cv2.WINDOW_NORMAL)cv2.setWindowProperty('win', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)# 显示图像while True:# 生成带时间的图像,并显示img_clock = draw_clock(np.copy(img_bg), datetime.now())cv2.imshow('win', img_clock)if cv2.waitKey(10) & 0xFF == 27:# 等待10ms,检测Esc按下事件break# 关闭窗口cv2.destroyAllWindows()if __name__ == "__main__":main()

以下是显示效果:

以下是本文的彩蛋,使用 cv2.Sobel() 提取数字的边缘,并进行显示。

如有错误的地方,欢迎指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/727871.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

grid布局所有元素在同一行显示且等分列

目录 一、问题 二、实现方式 三、总结 tiips:如嫌繁琐,直接移步总结即可! 一、问题 1.grid布局可以通过 grid-template-columns来指定列的宽度。且可以通过repeat来指定重复的次数。但是现在的需求是:grid布局中元素的数量不确定&#…

一篇文章带你通关并查集(持续更新中)

这篇文章的所有题目均来自于自行整理,代码均来自于自行梳理调试(思路可能比较暴力)。初衷在于整理练习思路,且起到督促自己学习的作用 本文分成将三个模块 1.普及组 (洛谷黄题) 2.提高组 (洛…

sqlserver 默认端口号不通 1433 开启监听

1.打开SQL Server 2022 配置管理器 查看这3个东西是否启用,然后双击TCP/IP 把默认端口全部设置成1433 然后cmd netstat -an | find "1433" 查看端口是否打开监听

存储架构 NAS 与 SAN:有什么区别?

SAN(Storage Area Network)和NAS(Network Attached Storage)是两种存储架构,它们在数据存储和管理方面有着不同的设计理念和应用场景。SAN通常将存储设备连接到一个独立的高速网络,而NAS则通过普通的网络协…

Unity性能优化篇(九) 模型优化之LOD技术概述以及操作方法

LOD模型优化技术概述: 1.LOD技术可以根据摄像头远近来显示不同精度的模型(例如吃鸡游戏 随着跳伞高度 来显示下面树木以及建筑的模型精度) LOD模型优化技术操作方法: 可使用Unity自带的LOD Group组件,并根据项目的情况来调整该组件的属性。Untiy资源商店也有一些其…

如何选择VR全景设备,才能拍摄高质量的VR全景?

随着VR全景技术的不断成熟和发展,VR全景已经成为了摄影爱好者乐于尝试的新手段,VR全景也为广大用户提供了一个全新的视角来探索世界,如果想要拍摄出高质量的VR全景,选择合适的VR全景拍摄设备以及掌握正确的拍摄技巧才是关键。 VR全…

云手机:网页运行?易用性分析

云手机作为一种新兴的技术,近年来在移动互联网领域备受关注。它通过云计算技术,将手机的操作系统和应用程序运行在远程服务器上,用户通过网络连接访问和操作云手机,从而实现了在任何设备上都能够享受手机的功能和体验。本文将探讨…

vue系列——vscode,node.js vue开发环境搭建

第一步安装node.js 推荐使用nvm进行node.js 的安装 nvm(Node.js version manager) 是一个命令行应用,可以协助您快速地 更新、安装、使用、卸载 本机的全局 node.js 版本。 可以去网上查找相关版本 我这里使用 nvm-setu… 链接:https://pan.baidu.com/s/1UEUtmzw5x…

代码随想录算法训练营第三十九天|动态规划|62.不同路径、63. 不同路径 II

62.不同路径 文章 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径&…

12.WEB渗透测试-Linux系统管理、安全加固(下)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:11.WEB渗透测试-Linux系统管理、安全加固(上)-CSDN博客 Linux任务…

好书安利:《大模型应用开发极简入门:基于GPT-4和ChatGPT》这本书太好了!150页就能让你上手大模型应用开发

文章目录 前言一、ChatGPT 出现,一切都变得不一样了二、蛇尾书特色三、蛇尾书思维导图四、作译者简介五、业内专家书评总结 前言 ​如果问个问题:有哪些产品曾经创造了伟大的奇迹?ChatGPT 应该会当之无愧入选。仅仅发布 5 天,Chat…

【RabbitMQ】WorkQueue

📝个人主页:五敷有你 🔥系列专栏:MQ ⛺️稳中求进,晒太阳 Work Queues Work queues任务模型,简单来说就是让多个消费者绑定到一个队列,共同消费队列中的消息 当消息处理比较耗时的时候&…

力扣112 路径总和 Java版本

文章目录 题目描述解题思路代码 题目描述 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则&#xff0…

新型设备巡检方案-手机云巡检

随着科技的不断发展,设备巡检工作也在逐步向智能化、高效化方向转变。传统的巡检方式往往需要人工逐个设备检查,耗时耗力,效率低下,同时还容易漏检和误检。而新型设备巡检应用—手机蓝牙云巡检的出现,则为设备巡检工作…

每日OJ题_链表②_力扣24. 两两交换链表中的节点

目录 力扣24. 两两交换链表中的节点 解析代码 力扣24. 两两交换链表中的节点 24. 两两交换链表中的节点 难度 中等 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即&…

Java定时调度范式定时操作

在 Java 中,我们可以使用各种方法来执行定时操作。这些操作包括执行任务、调度任务、执行重复任务等。下面将介绍几种常见的 Java 定时调度范式。 1. Timer 和 TimerTask Java 提供了 Timer 和 TimerTask 类,用于执行定时任务。 示例代码:…

MyBatis操作数据库(SQL注入)

本文主要来讲解6大标签&#xff0c;以便更好的MyBatis操作数据库&#xff01; <if>标签<trim>标签<where>标签<set>标签<foreach>标签<include>标签 前提需求&#xff1a; MyBatis是一个持久层框架&#xff0c;和Spring没有任何关系&…

【力扣白嫖日记】1070.产品销售分析III

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 1070.产品销售分析III 表&#xff1a;Sales 列名类型sale_idintproduct_idintyearintquantityintpriceint …

Mybatis-Plus Mapper映射文件使用

介绍 MyBatis 的真正强大在于它的语句映射&#xff0c;这是它的魔力所在。由于它的异常强大&#xff0c;映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比&#xff0c;你会立即发现省掉了将近 95% 的代码。MyBatis 致力于减少使用成本&#xff0…

day2 FreeRTOS

思维导图 1.使用ADC采样光敏电阻数值&#xff0c;如何根据这个数值调节LED灯亮度。 HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_3);//打开定时器3的通道3并且设置为PWM功能/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */int adc_val 0;while (1){HAL_…