1. 需求分析
- 使用OpenCV中可用的绘图功能创建OpenCV的徽标;
- 目标图像及目标图像的宽高;
- 测量绘制的目标的外径和内径;
- 测量绘制的目标的颜色;
- 计算绘制的目标的圆心;
- 绘制目标的文字;
- 将原图和绘制图像放到一起对比。
2. 目标图像
3. 代码实现
- 目标图像及目标图像的宽高;
- 复制一个opencv-logo矩阵;
- 使用Photoshop测量外径和内径;
- 使用Photoshop测量各个圆的颜色;
- 计算各个绘制圆的圆心;
- 分别绘制三个圆,使用同心圆去掉中间部分,使用椭圆实现圆弧缺口;
- 绘制 OpenCV 的文字;
- 将原图和自绘图放入一张图片进行对比。
import cv2 as cv
import numpy as np
def draw_opencv_logo():
logo = cv.imread("./images/opencv-logo-white.png")
h,w,c = logo.shape
# 复制一个opencv-logo矩阵,赋值白色
img = np.zeros_like(logo)
# img.fill(255)
# 使用Photoshop测量外径和内径
max_d = 86
max_r = int(max_d / 2)
min_d = 34
min_r = int(min_d / 2)
# 使用Photoshop测量各个圆的颜色
color_red = (68,42,255)
color_green = (103,218,139)
color_blue = (255,141,18)
color_bg = (255,255,255)
color_black = (0,0,0)
# 圆心计算
center_red = (int(w / 2), max_r)
center_green = (max_r, max_d + max_r - 8)
center_blue = (w - max_r, max_d + max_r - 8)
# 顶部红色圆
cv.circle(img, center_red, max_r, color_red, -1,cv.LINE_AA)
cv.circle(img, center_red, min_r, color_black, -1,cv.LINE_AA)
cv.ellipse(img, center_red, (max_r, max_r + 2), 0, 60, 120, color_black, -1,cv.LINE_AA)
# 左侧绿色圆【椭圆整体旋转240度】
cv.circle(img, center_green, max_r, color_green, -1,cv.LINE_AA)
cv.circle(img, center_green, min_r, color_black, -1,cv.LINE_AA)
cv.ellipse(img, center_green, (max_r, max_r + 2), 240, 60, 120, color_black, -1,cv.LINE_AA)
# 右侧蓝色圆【椭圆整体旋转180度】
cv.circle(img, center_blue, max_r, color_blue, -1,cv.LINE_AA)
cv.circle(img, center_blue, min_r, color_black, -1,cv.LINE_AA)
cv.ellipse(img, center_blue, (max_r, max_r + 2), 180, 60, 120, color_black, -1,cv.LINE_AA)
# 绘制下边的文字
cv.putText(img, "OpenCV", (0, h - 15), cv.FONT_HERSHEY_DUPLEX, 1.5, color_bg,4)
# 将原图和自绘图放入一张图片
create_img = np.zeros((h,w*2,3),np.uint8)
# 左边原图,右边刚刚绘制的图片
create_img[:h,:w] = logo
create_img[:h,w:] = img
cv.imshow('opencv_logo', create_img)
cv.waitKey(0)
cv.destroyAllWindows()
if __name__ == "__main__":
draw_opencv_logo()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
4. 实现结果
5. 总结
- 由于图像尺寸不大,所以采用的 lineType 是 cv.LINE_AA,图标看着比较平滑;
- 由于原图标的字体没找到,因此在 cv 提供的字体中找了一个比较接近的字体;
- 椭圆的 angle 参数是可以控制圆弧的旋转的,因此缺口只需要设置不同旋转角度就好。