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()

4. 实现结果

输入图片说明

5. 总结

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rattenking

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值