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


    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. 将原图和自绘图放入一张图片进行对比。
    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. 总结

    1. 由于图像尺寸不大,所以采用的 lineType 是 cv.LINE_AA,图标看着比较平滑;
    2. 由于原图标的字体没找到,因此在 cv 提供的字体中找了一个比较接近的字体;
    3. 椭圆的 angle 参数是可以控制圆弧的旋转的,因此缺口只需要设置不同旋转角度就好。
  • 相关阅读:
    Pyinstaller生成的exe程序,运行时找不到自定义模块
    专为程序员量身定制的云 IDE,你用了吗
    02_Flutter自定义Sliver组件实现分组列表吸顶效果
    PLC数据采集案例
    Matlab基础用法
    Spring Boot接收从前端传过来的数据常用方式以及处理的技巧
    Java-IDEA-类注释快捷键
    【毕业设计】基于SSM的进存销管理系统 - spring mvc java web
    2023上海国际电力电工展盛大举行 规模创新高 与行业「升级、转型、融合」
    【牛客编程题】GO语言入门46题
  • 原文地址:https://blog.csdn.net/m0_38082783/article/details/127534315