• 【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 代码:

    1. #-*- Coding: utf-8 -*-
    2. import cv2
    3. import numpy as np
    4. from datetime import datetime
    5. num_mask = {n: cv2.imread(f'./src/{n}.PNG', cv2.IMREAD_GRAYSCALE) for n in range(10)}
    6. def draw_number(image, slice, iy, ix):
    7. # 根据ix,iy坐标放置数字
    8. slice_ext = np.zeros(image.shape, dtype=np.uint8)
    9. slice_ext[iy: iy+slice.shape[0], ix: ix+slice.shape[1]] = slice
    10. # 使用cv2.bitwise_or()函数叠加
    11. dst_img = cv2.bitwise_or(image, slice_ext)
    12. return dst_img
    13. def draw_clock(image, current):
    14. # 创建纯色图像
    15. height, width, channel = 1179, 960, 3
    16. color_light = np.zeros((height, width, channel), dtype=np.uint8)
    17. color_light[:] = (0xFA, 0xC5, 0x51) # in BGR mode
    18. color_deep = np.zeros((height, width, channel), dtype=np.uint8)
    19. color_deep[:] = (0xBA, 0x62, 0x00) # in BGR mode
    20. # 使用cv2.bitwise_and()函数给数字上色
    21. hour_slice1 = cv2.bitwise_and(color_deep, color_deep, mask=num_mask[current.hour // 10])
    22. hour_slice2 = cv2.bitwise_and(color_light, color_light, mask=num_mask[current.hour % 10])
    23. minute_slice1 = cv2.bitwise_and(color_deep, color_deep, mask=num_mask[current.minute // 10])
    24. minute_slice2 = cv2.bitwise_and(color_light, color_light, mask=num_mask[current.minute % 10])
    25. # 绘制时间
    26. col_min = (image.shape[0]-height)//2
    27. row_min = (image.shape[1]-width)//6
    28. image = draw_number(image, hour_slice1, col_min, row_min)
    29. image = draw_number(image, hour_slice2, col_min, row_min+image.shape[1]//8)
    30. image = draw_number(image, minute_slice1, col_min, row_min+image.shape[1]//8*3)
    31. image = draw_number(image, minute_slice2, col_min, row_min+image.shape[1]//8*4)
    32. return image
    33. def main():
    34. # 新建背景图像
    35. row, col, channel = 2160, 3840, 3
    36. img_bg = np.zeros(shape=(row, col, channel), dtype=np.uint8)
    37. # 创建窗口,并设置属性
    38. cv2.namedWindow('win', cv2.WINDOW_NORMAL)
    39. cv2.setWindowProperty('win', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
    40. # 显示图像
    41. while True:
    42. # 生成带时间的图像,并显示
    43. img_clock = draw_clock(np.copy(img_bg), datetime.now())
    44. cv2.imshow('win', img_clock)
    45. if cv2.waitKey(10) & 0xFF == 27:
    46. # 等待10ms,检测Esc按下事件
    47. break
    48. # 关闭窗口
    49. cv2.destroyAllWindows()
    50. if __name__ == "__main__":
    51. main()

    以下是显示效果:

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

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

  • 相关阅读:
    kafka入门教程,介绍全面
    Spring Data JPA - Web 支持、使用Pageable 参数Thymeleaf 视图进行搜索/过滤、排序和分页
    反射 - 枚举 - Lambda表达式
    17 结构型模式-享元模式
    C语言字符转数字函数
    【UI测试】内容及流程
    vue 监听页面卷去的高度,获取元素离页面顶部的距离
    应用配置管理,基础原理分析
    LeetCode 面试题 08.06. 汉诺塔问题
    【IVI】15.1.5 系统稳定性优化篇(LMKD VI)Vmpressure监视器初始化及其工作原理
  • 原文地址:https://blog.csdn.net/sxyang2018/article/details/136543918