赞
踩
OpenCV 是一个开源的计算机视觉(Computer Vision)与机器学习软件库,提供了多种图像处理算法与接口。在图像处理中,按位运算是一类重要的运算,可以用于提取图像的重要部分。本文主要记录如何使用 OpenCV-Python 绘制仿 IOS 的锁屏时钟。
目录
在图像处理中,按位运算是一类重要的运算。OpenCV 提供了以下 4 种按位运算,包括:
另外,按位运算可以配合图像掩膜使用,用于提取图像中的重要部分。
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)
以下是 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() 提取数字的边缘,并进行显示。
如有错误的地方,欢迎指正。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。