OpenCV-Python实战(2) —— 使用OpenCV的绘图功能创建OpenCV的徽标

2022-11-07 14:47:39 浏览数 (1)

1. 需求分析

  1. 使用OpenCV中可用的绘图功能创建OpenCV的徽标;
  2. 目标图像及目标图像的宽高;
  3. 测量绘制的目标的外径和内径;
  4. 测量绘制的目标的颜色;
  5. 计算绘制的目标的圆心;
  6. 绘制目标的文字;
  7. 将原图和绘制图像放到一起对比。

2. 目标图像

3. 代码实现

  1. 目标图像及目标图像的宽高;
  2. 复制一个opencv-logo矩阵;
  3. 使用Photoshop测量外径和内径;
  4. 使用Photoshop测量各个圆的颜色;
  5. 计算各个绘制圆的圆心;
  6. 分别绘制三个圆,使用同心圆去掉中间部分,使用椭圆实现圆弧缺口;
  7. 绘制 OpenCV 的文字;
  8. 将原图和自绘图放入一张图片进行对比。
代码语言:javascript复制
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()

4. 实现结果

5. 总结

  1. 由于图像尺寸不大,所以采用的 lineType 是 cv.LINE_AA,图标看着比较平滑;
  2. 由于原图标的字体没找到,因此在 cv 提供的字体中找了一个比较接近的字体;
  3. 椭圆的 angle 参数是可以控制圆弧的旋转的,因此缺口只需要设置不同旋转角度就好。

0 人点赞