【OpenCV】仿 IOS 锁屏时钟

本文介绍了如何利用OpenCV中的按位运算函数(如cv2.bitwise_and(),cv2.bitwise_or()等)结合图像掩码,实现在Python中绘制带有数字的仿IOS风格锁屏时钟。作者详细展示了如何设计程序,包括使用掩码上色和边缘检测的Sobel函数。
摘要由CSDN通过智能技术生成

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 datetime

num_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_img

def draw_clock(image, current):
   # 创建纯色图像
   height, width, channel = 1179, 960, 3
   color_light = np.zeros((height, width, channel), dtype=np.uint8)
   color_light[:] = (0xFA, 0xC5, 0x51) # in BGR mode

   color_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)//2
   row_min = (image.shape[1]-width)//6
   
   image = 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 image

def main():
   # 新建背景图像
   row, col, channel = 2160, 3840, 3
   img_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() 提取数字的边缘,并进行显示。

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

  • 15
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洋洋Young

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值