• 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 参数是可以控制圆弧的旋转的,因此缺口只需要设置不同旋转角度就好。
  • 相关阅读:
    SMART 200PLC S型速度曲线应用(梯形图)
    MindSponge分子动力学模拟——多路径分子模拟(2024.05)
    【小月电子】FPGA开发板(Spirit_V4)系统学习教程-LESSON8 LCD1602液晶显示
    【云原生】docker环境中安装mysql、redis服务
    发音测评 kaldi compute gop 保姆级实战指南
    Vue源码之模板编译浅析
    深入理解Kafka分区副本机制
    CCNA课程实验-14-Final_Lab
    Nacos(替代Eureka)注册中心
    Selenium 隐藏浏览器指纹特征的几种方式
  • 原文地址:https://blog.csdn.net/m0_38082783/article/details/127534315