使用Python,OpenCV进行涂鸦(绘制文字、线、圆、矩形、椭圆、多边形轮廓、多边形填充、箭头)

  • 1. 效果图
  • 2. 原理
    • 2.1 绘制线:cv2.line(canvas, (300, 0), (0, 300), (255, 0, 255), 3)
    • 2.2 绘制矩形:cv2.rectangle(canvas, (200, 50), (225, 125), (0, 0, 255), -1)
    • 2.3 绘制圆:cv2.circle(canvas, (200, 50), 5, (255, 0, 0), -1)
    • 2.4 绘制椭圆:cv2.ellipse(canvas, (200, 200), (150, 100), -60, 0, 300, (255, 0, 0), -1)
    • 2.5 绘制文字:cv2.putText(canvas, "Beautiful", (30, 100), cv2.FONT_HERSHEY_PLAIN, 2, (0, 0, 255), 1)
    • 2.6 NumPy的随机数功能:np.random.randint
  • 3. 源码
  • 参考

这篇博客将介绍使用Python,OpenCV绘制文字、线、圆、矩形、椭圆、多边形轮廓、多边形填充、箭头。

1. 效果图

线效果图如下:

矩形效果图如下:

圆效果图靶子如下:

随机圆心、颜色、半径效果图如下:

椭圆效果图如下:


绘制文字效果图如下:

绘制多边形轮廓,多边形填充效果图如下:

随机颜色,起终点箭头效果图如下:

2. 原理

2.1 绘制线:cv2.line(canvas, (300, 0), (0, 300), (255, 0, 255), 3)

  • image 画布
  • pt1 起点
  • pt2 终点
  • color 颜色
  • thickness 线的宽度

2.2 绘制矩形:cv2.rectangle(canvas, (200, 50), (225, 125), (0, 0, 255), -1)

  • canvas 要绘制的画布
  • pt1 起始点坐标
  • pt2 终止点坐标
  • color 外轮廓线的颜色
  • thickness 画笔的厚度,负数:填充,整数,轮廓线的宽度

2.3 绘制圆:cv2.circle(canvas, (200, 50), 5, (255, 0, 0), -1)

  • image 画布
  • center 圆心坐标
  • radius 半径
  • color 颜色
  • thickness 正数:线条宽度,负数: 填充区域

2.4 绘制椭圆:cv2.ellipse(canvas, (200, 200), (150, 100), -60, 0, 300, (255, 0, 0), -1)

  • img 图像
  • (int(cX), int(cY)) 中心
  • (150,100) 长轴、短轴
  • angle 旋转角度,负的逆时针旋转,正的顺时针旋转;
  • start_angle 开始角度
  • end_angle 结束角度
  • color 颜色
  • thickness 负数填充,正数线条粗细

2.5 绘制文字:cv2.putText(canvas, “Beautiful”, (30, 100), cv2.FONT_HERSHEY_PLAIN, 2, (0, 0, 255), 1)

  • img 图片
  • “Good job” 文字内容
  • (int(cX - 10), int(cY)) 绘制起始的像素
  • cv2.FONT_HERSHEY_SIMPLEX
  • 0.45 基于字体特定基大小的比例因子
  • (0, 255, 0) 颜色
  • 2 绘制文本的线条粗细

2.6 NumPy的随机数功能:np.random.randint

随机生成1个数(5,200之间):radius = np.random.randint(5, high=200)
随机生成3个数(0,256之间)color = np.random.randint(0, high=256, size=(3,)).tolist()

3. 源码

# 绘制文字、线、圆、矩形、椭圆、多边形轮廓、多边形填充、箭头
# USAGE
# python basic_drawing.py# 导入必要的包
import numpy as np
import cv2# 初始化空数组图像并绘制
# 初始化画布(300*300)的3通道
canvas = np.zeros((300, 300, 3), dtype="uint8")
# 绘制文字
# - img 图片
# - "Good job" 文字内容
# - (int(cX - 10), int(cY)) 绘制起始的像素
# - cv2.FONT_HERSHEY_SIMPLEX
# - 0.45 基于字体特定基大小的比例因子
# - (0, 255, 0) 颜色
# - 2 绘制文本的线条粗细
cv2.putText(canvas, "Beautiful", (30, 100), cv2.FONT_HERSHEY_PLAIN, 2, (0, 0, 255), 1)
cv2.putText(canvas, "Excellent", (50, 150), cv2.FONT_HERSHEY_DUPLEX, 0.5, (255, 0, 0), 2)
cv2.putText(canvas, "Good job", (150, 200), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 5)
cv2.putText(canvas, "Marvelously", (20, 250), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (0, 255, 255), 3)
cv2.imshow("Canvas", canvas)
cv2.waitKey(0)# 初始化空数组图像并绘制
# 初始化画布(300*300)的3通道
canvas = np.zeros((300, 300, 3), dtype="uint8")# 从左上到右下绘制一条绿色的线
green = (0, 255, 0)
cv2.line(canvas, (0, 0), (300, 300), green)
cv2.imshow("Canvas", canvas)
cv2.waitKey(0)# 从右上到左下绘制一条宽度为3像素的红色线
red = (0, 0, 255)
# 绘制线
# --image 画布
# --pt1 起点
# --pt2 终点
# --color 颜色
# --thickness 线的宽度
cv2.line(canvas, (300, 0), (0, 300), red, 3)
cv2.imshow("Canvas", canvas)
cv2.waitKey(0)cv2.line(canvas, (50, 100), (300, 250), (0, 255, 255), 2, cv2.LINE_8, 3)
cv2.imshow("Canvas", canvas)
cv2.waitKey(0)# 绘制一个50*50的绿色矩形(从(10,10)到(60*60)
canvas = np.zeros((300, 300, 3), dtype="uint8")
cv2.rectangle(canvas, (10, 10), (60, 60), green)
cv2.imshow("Canvas", canvas)
cv2.waitKey(0)# 绘制另一个宽度为像素的红色矩形,从(50,200)到(200,225)
cv2.rectangle(canvas, (50, 200), (200, 225), red, 5)
cv2.imshow("Canvas", canvas)
cv2.waitKey(0)# 绘制一个蓝色填充的矩形
blue = (255, 0, 0)
# --canvas 要绘制的画布
# --pt1 起始点坐标
# --pt2 终止点坐标
# --color 外轮廓线的颜色
# --thickness 画笔的厚度,负数:填充,整数,轮廓线的宽度
cv2.rectangle(canvas, (200, 50), (225, 125), blue, -1)
cv2.imshow("Canvas", canvas)
cv2.waitKey(0)# 重新初始化一块画布,计算画布的中心
canvas = np.zeros((300, 300, 3), dtype="uint8")
print(canvas.shape[1] / 2, canvas.shape[0] / 2)
print(canvas.shape[1] // 2, canvas.shape[0] // 2)
print((int)(canvas.shape[1] / 2), (int)(canvas.shape[0] / 2))
(centerX, centerY) = (canvas.shape[1] // 2, canvas.shape[0] // 2)
white = (255, 255, 255)# 遍历不同的圆半径,绘制多个圆
for r in range(0, 175, 25):# 绘制白色圆cv2.circle(canvas, (centerX, centerY), r, white)
# 展示画布最终效果
cv2.imshow("Canvas", canvas)
cv2.waitKey(0)# 重新初始化一块画布
canvas = np.zeros((300, 300, 3), dtype="uint8")
# 随机绘制25个圆
for i in range(0, 25):# 随机生成5~200的半径# 随机生成颜色# 随机取一个点作为圆心radius = np.random.randint(5, high=200)color = np.random.randint(0, high=256, size=(3,)).tolist()pt = np.random.randint(0, high=300, size=(2,))# 绘制圆在画布上,用填充色# --image 画布# --center 圆心坐标# --radius 半径# --color 颜色# --thickness 正数:线条宽度,负数: 填充区域cv2.circle(canvas, tuple(pt), radius, color, -1)# 展示杰作到屏幕
cv2.imshow("Canvas", canvas)
cv2.waitKey(0)# 重新初始化一块画布
canvas = np.zeros((400, 400, 3), dtype="uint8")
# 绘制椭圆
# - img 图像
# - (int(cX), int(cY)) 中心
# - (150,100) 长轴,短轴
# - angle 旋转角度,负的逆时针旋转,正的顺时针旋转;
# - start_angle 开始角度
# - end_angle 结束角度
# - (90,90,90) 颜色
# - -1 负数:填充,正数:线条粗细
cv2.ellipse(canvas, (250, 200), (150, 100), -60, 0, 300, (233, 0, 233), -1)
cv2.ellipse(canvas, (100, 100), (80, 40), 0, 0, 280, (255, 255, 0), 2)
cv2.ellipse(canvas, (80, 300), (60, 30), 90, 30, 360, (0, 255, 255), 4)
cv2.imshow("Canvas", canvas)
cv2.waitKey(0)# 重新初始化一块画布
canvas = np.zeros((400, 400, 3), dtype="uint8")
pts = np.random.randint(50, 300, size=((8, 2)))
print(pts.shape)
print(pts)
# 绘制多边形的轮廓
cv2.polylines(canvas, [pts], isClosed=True, color=(255, 0, 255), thickness=1)
cv2.imshow("polylines", canvas)
cv2.waitKey(0)# 绘制多边形填充
cv2.fillPoly(canvas, [pts], color=(255, 255, 0))
cv2.imshow("fillPoly", canvas)
cv2.waitKey(0)# 重新初始化一块画布
canvas = np.zeros((400, 400, 3), dtype="uint8")
# 绘制箭头
cv2.arrowedLine(canvas, (300, 100), (250, 300), (0, 233, 220), 3)
for i in range(6):color = np.random.randint(0, high=256, size=(3,)).tolist()pt = np.random.randint(0, high=300, size=(2,))pt2 = np.random.randint(0, high=300, size=(2,))cv2.arrowedLine(canvas, tuple(pt), tuple(pt2), color, 3)cv2.imshow("arrowedLine", canvas)
cv2.waitKey(0)
cv2.destroyAllWindows()

参考

  • https://www.pyimagesearch.com/2021/01/27/drawing-with-opencv/

使用Python,OpenCV进行涂鸦(绘制文字、线、圆、矩形、椭圆、多边形轮廓、多边形填充、箭头~)相关推荐

  1. 番外3. Python OpenCV 中如何绘制各种图形?

    本系列专栏写作方式 本系列专栏写作将采用首创的问答式写作形式,快速让你学习到 OpenCV 的初级.中级.高级知识. 3. Python OpenCV 中如何绘制各种图形? 本篇博客主要分享一下在 P ...

  2. python画椭圆-python opencv圆、椭圆与任意多边形的绘制实例详解

    圆形的绘制 : OpenCV中使用circle(img,center,radius,color,thickness=None,lineType=None,shift=None)函数来绘制圆形 impo ...

  3. python+opencv图像处理之边缘检测车道线识别

    python+opencv图像处理之边缘检测车道线识别 1.自行安装python和opencv 2.导入我们要使用的相关库 import cv2 from matplotlib import pypl ...

  4. OpenCV在图像上画线、矩形、椭圆、多边形、填充的多边形、圆、显示文字

    OpenCV在图像上随机画直线.椭圆.多边形.圆.显示文字 代码如下: /*** @file Drawing_2.cpp* @brief Simple sample code*/#include &l ...

  5. python opencv 双击鼠标绘制圆

    10-python opencv 双击鼠标绘制圆 10-python opencv 双击鼠标绘制圆 概述 实现过程 引用与创建空图 设置回调函数 回调上述函数 显示图像 源代码 运行结果 参考 概述 ...

  6. 如何用Python的pyecharts库绘制K线图

    01 K线图 一.概念 股市及期货市场中的K线图的画法包含四个数据,即开盘价.最高价.最低价.收盘价,所有的K线都是围绕这四个数据展开,反映大势的状况和价格信息.如果把每日的K线图放在一张纸上,就能得 ...

  7. python绘制漂亮的线_使用PyQtGraph进行Python数据可视化:绘制精美线图(以上证指数走势为例)...

    在上两篇文章中,我们介绍了: 本篇文章将介绍使用PyQtGraph绘制一个精美折线图, 在了解了基本的PyQtGraph模块绘制图形功能之后,我们通过几个常用常见的数据可视化图形来演示使用PyQtGr ...

  8. Python+OpenCV图像处理(十五)—— 圆检测

    简介: 1.霍夫圆变换的基本原理和霍夫线变换原理类似,只是点对应的二维极径.极角空间被三维的圆心和半径空间取代.在标准霍夫圆变换中,原图像的边缘图像的任意点对应的经过这个点的所有可能圆在三维空间用圆心 ...

  9. python用circle画多边形_pythonopencv圆、椭圆与任意多边形的绘制

    圆形的绘制 : OpenCV中使用circle(img,center,radius,color,thickness=None,lineType=None,shift=None)函数来绘制圆形 impo ...

  10. OpenCV在图片上画线和矩形

    今天讲一下通过opencv的Line函数,在图像中绘制一条我们想要的直线或者线段,以及使用Rectangle函数绘制矩形: CV_RGB 创建一个色彩值. #define CV_RGB( r, g, ...

最新文章

  1. 之前遇到一位老面试官,问我的问题真的有点东西
  2. 公众号点击图片变成另一张_微信公众号点击出现图片是怎么实现的?
  3. java中spring的注解_spring中的各种注解解析
  4. 关于注册登陆时候进行的归档解档--严焕培
  5. java 英文分词器使用代码_java文本英文分词
  6. Ubuntu下修改file descriptor
  7. 使用Twitter Bootstrap,WebSocket,Akka和OpenLayers玩(2.0)
  8. spring初始化bean时执行某些方法完成特定的初始化操作
  9. PHP并行查询MySQL
  10. 力扣-547 省份数量
  11. mnist数据集下载linux,机器学习数据集篇——MNIST数据集
  12. vue html实例,一个页面上多个Vue实例
  13. 软件项目管理期末复习---项目立项
  14. yota3无第三方recovery root方法
  15. MTK超详细启动流程
  16. GBase8a数据库中表的comment信息
  17. 计算机网络的组成和主要功能,计算机网络的组成与功能
  18. python24点4张扑克_Python实现扑克24点 ,从此我就没输过。
  19. 计算机课堂小游戏活跃气氛,活跃气氛的70个小游戏 比较嗨的暖场游戏
  20. 厚基础Linux——学习笔记(一)

热门文章

  1. C++ 共用体union 的使用
  2. Redeclared ‘list_b‘ defined above without usage
  3. android 支付宝支付 出现系统繁忙,请稍后重试(ALI10)
  4. jboss_log4j.xml配置
  5. HDFS Java 客户端使用(Windows开发环境)
  6. 2022-2028年中国服务器行业投资分析及前景预测报告
  7. 2022-2028年中国肉制品行业市场调查研究及前瞻分析报告
  8. Go 学习笔记(12)— 字典map定义、初始化、读取字典、删除字典、清空字典、map 按 key 进行有序遍历
  9. Jenkins 2.16.3默认没有Launch agent via Java Web Start,如何配置使用
  10. 用java实现给图片增加图片水印或者文字水印(也支持视频图像帧添加水印)