导读:本期聚焦于蜗牛创作的《Python中如何使用OpenCV进行画图?常用绘图函数详解》,敬请观看详情。想在图片上画直线、矩形、圆形还是添加文字标注?OpenCV提供的绘图函数可以轻松搞定这些需求。本文详细介绍cv2.line、cv2.rectangle、cv2.circle、cv2.ellipse、cv2.polylines以及cv2.putText等常用绘图函数的使用方法,包括各参数含义、坐标体系说明、线条颜色与粗细设置技巧,并给出完整代码示例和实际应用场景。无论你是做目标检测的结果可视化,还是在图像处理项目中标注感兴趣区域,掌握这些基础绘图操作都非常有必要。文章还分析了常见报错原因和坐标越界等踩坑点,帮助你快速上手图像绘制。

图像绘制是计算机视觉项目中绕不开的基础操作。无论是目标检测后把识别框画在图片上,还是图像处理时标注出感兴趣区域,都离不开OpenCV提供的绘图函数。OpenCV的绘图API设计得非常直观,所有函数都直接作用于numpy数组,画完即可查看结果,上手门槛很低。本文将系统讲解Python环境下OpenCV的各类绘图函数,从最简单的直线到复杂的多边形和文字,逐一分析参数含义并给出可运行的代码。

Python中如何使用OpenCV进行画图?常用绘图函数详解

绘图前的准备工作与通用参数说明

在使用绘图函数之前,需要先安装OpenCV库并创建一块画布。安装命令为pip install opencv-python,安装完成后导入cv2和numpy即可开始。画布本质上就是一个numpy数组,可以通过np.zeros创建纯黑图像,也可以用cv2.imread读取已有图片作为画布。

import cv2
import numpy as np

# 创建一个500x500的纯黑画布,3表示三个颜色通道
canvas = np.zeros((500, 500, 3), dtype=np.uint8)
cv2.imshow("canvas", canvas)
cv2.waitKey(0)
cv2.destroyAllWindows()

OpenCV的绘图函数有几个通用的参数规则需要先搞清楚。首先是坐标系:原点在图像左上角,x轴向右增长,y轴向下增长,这与我们熟悉的数学坐标系不同,新手最容易在这里犯迷糊。其次是颜色:OpenCV采用BGR顺序而不是RGB,例如(255,0,0)在OpenCV中表示蓝色而非红色,这一点务必牢记。最后是线条粗细参数thickness,以像素为单位,传-1表示填充图形内部。

还有一个细节值得注意:绘图函数会直接修改传入的图像数组,也就是原地操作。如果想保留原图,需要先用img.copy()复制一份再画,否则原图就被永久改写了,这在批处理场景下经常造成难以排查的bug。

基本图形绘制:直线、矩形与圆形

直线、矩形和圆形是使用频率最高的三种图形。cv2.line接收画布、起点坐标、终点坐标、颜色和粗细五个核心参数。cv2.rectangle需要左上角和右下角两个坐标点确定矩形位置。cv2.circle则需要圆心坐标和半径。三个函数的使用方式如下:

import cv2
import numpy as np

canvas = np.zeros((500, 500, 3), dtype=np.uint8)

# 画一条绿色直线,从(50,50)到(450,50)
cv2.line(canvas, (50, 50), (450, 50), (0, 255, 0), thickness=2)

# 画一个红色矩形,thickness=-1表示实心填充
cv2.rectangle(canvas, (100, 100), (300, 250), (0, 0, 255), thickness=-1)

# 画一个蓝色圆环,圆心(250,380) 半径60
cv2.circle(canvas, (250, 380), 60, (255, 0, 0), thickness=3)

# 线型参数lineType=cv2.LINE_AA可以让边缘更平滑
cv2.circle(canvas, (400, 380), 60, (255, 255, 0), thickness=3, lineType=cv2.LINE_AA)

cv2.imshow("shapes", canvas)
cv2.waitKey(0)
cv2.destroyAllWindows()

关于lineType参数有必要多说几句。默认的线条类型是LINE_8,即8连通线,绘制速度快但边缘有锯齿。如果对显示效果有要求,可以加上lineType=cv2.LINE_AA启用抗锯齿,画出来的圆和斜线会明显更平滑。在生成报告截图或演示图片时,建议始终开启抗锯齿。

矩形绘制在实际项目中最常见的用途是目标检测可视化。通常检测结果会给出边界框的坐标,直接把这个坐标传给cv2.rectangle就能画出标注框,再用cv2.putText在框上方写上类别名和置信度,一张标准的检测结果图就完成了。注意矩形坐标必须满足左上角在右下角之前,否则某些版本的OpenCV会画不出预期的效果。

进阶图形:椭圆、多边形与文字

椭圆函数cv2.ellipse的参数相对复杂,支持旋转角度和弧度范围,可以画出完整的椭圆也可以只画一段弧线。多边形绘制使用cv2.polylines,需要传入一组顶点坐标。文字则使用cv2.putText,可以指定字体、缩放和颜色。

import cv2
import numpy as np

canvas = np.zeros((500, 500, 3), dtype=np.uint8)

# 椭圆:圆心(120,120) 长短轴(80,40) 旋转30度 画0到360度完整椭圆
cv2.ellipse(canvas, (120, 120), (80, 40), 30, 0, 360, (0, 255, 255), 2)

# 多边形:顶点必须是int32类型的numpy数组
pts = np.array([[300, 80], [450, 150], [420, 300], [300, 250]], np.int32)
pts = pts.reshape((-1, 1, 2))
cv2.polylines(canvas, [pts], isClosed=True, color=(255, 0, 255), thickness=2)

# 添加文字,FONT_HERSHEY_SIMPLEX是最常用的字体
cv2.putText(canvas, "Hello OpenCV", (120, 450),
            cv2.FONT_HERSHEY_SIMPLEX, 1.2, (255, 255, 255), 2, cv2.LINE_AA)

cv2.imshow("advanced", canvas)
cv2.waitKey(0)
cv2.destroyAllWindows()

使用cv2.polylines时有个必须注意的点:顶点数组的shape必须是(N, 1, 2),所以通常要调用reshape((-1, 1, 2))调整形状,且数据类型必须是int32,否则会直接报错。isClosed参数控制多边形是否自动闭合首尾两个点。

cv2.putText最大的限制是不支持中文,默认字体库只包含ASCII字符,直接写中文会显示成问号。如果必须在图片上输出中文,常见的解决方案是借助PIL库:先把numpy数组转成PIL的Image对象,用PIL的ImageDraw配合系统字体绘制中文,再转回numpy数组。虽然多了一步转换,但这是目前最稳妥的中文渲染方案。

另外,putText没有自动换行功能,长文本需要自己按宽度手动截断分行,每行单独调用一次putText并递增y坐标。做水印或日志叠加时记得提前计算好行距,一般取字体高度的1.3到1.5倍比较美观。

常见问题与避坑指南

第一个高频报错是坐标类型问题:所有坐标必须是整数,传浮点数会抛出类型错误。目标检测输出的坐标往往是float类型,画图前一定要用int()转换。第二个坑是颜色顺序,习惯了RGB的开发者经常把颜色画反,红色画成了蓝色,检查BGR顺序即可解决。

坐标越界也是一个隐性问题。OpenCV对越界坐标比较宽容,超出画布的部分会被自动裁剪而不报错,但这可能掩盖逻辑错误。比如目标框坐标超出了图像尺寸,画出来的图看起来正常,实际上检测后处理已经出了问题。建议在调试阶段手动校验坐标范围。

最后提醒一点,绘图操作是在内存中完成的,如果想保存结果别忘记调用cv2.imwrite("result.png", canvas),只在imshow里看一眼是不落盘的。在无界面的服务器环境运行时,imshow会导致程序卡死或报错,直接用imwrite保存即可。掌握这些细节后,配合numpy的数组操作,你几乎可以在图像上绘制出任何想要的标注效果。

Python OpenCVOpenCV画图cv2绘图函数修改时间:2026-09-12 09:30:35

免责声明:已尽一切努力确保本网站所含信息的准确性。网站作品多为原创整理与精心创作,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们进行处理Email:chomcom@qq.com。
引用或转载本作品时,请注明当前出处:https://www.ipipp.com/html/20260912/55244.html,基于非商业用途的前提下,欢迎转载或二创本作品。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。