Python OpenCV基础:常用图形与文本绘制详解
本文系统介绍OpenCV中常用的图形绘制函数,涵盖直线、矩形、圆形、多边形及文本标注的具体用法与参数说明。通过代码案例展示如何在图像上标记检测结果、关键点及轮廓,并演示基于鼠标事件的交互式绘图实现方法,为图像检测与识别任务提供基础可视化支持。
背景
在图像处理任务中,无论是目标检测还是图像识别,利用OpenCV绘制图形和文字来标注处理结果都是必不可少的技能。本文将详细解析各类图形的绘制方法。
一、画线
使用cv2.line函数绘制直线,其参数包括图像对象、起始坐标、终点坐标、颜色以及线宽。通常情况下,前四个参数已足够满足基本需求。
代码案例:
cv2.line(img, (20, 100), (20, 500), (0,0,255))
上述代码绘制了一条沿Y轴方向的红色线段。
二、画矩形
矩形绘制是应用最为广泛的方法之一。在目标检测项目中,返回的结果通常格式为(x, y, w, h)或(x1, y1, x2, y2)。虽然函数需要左上角和右下角坐标,但通过已知参数计算另一角点坐标十分简便。
cv2.rectangle(img, (x1,y1), (x2,y2), (0,0,255), 3) # 后面两个参数为颜色和线长
以下展示了基于DeepFashion数据集绘制矩形框的实际效果:

三、画圆
在实际应用中,直接画圆的场景相对较少,更多时候是绘制关键点(如关键点检测任务)。关键点在视觉上表现为实心圆,因此这里同时介绍画实心圆(即画点)和空心圆的两种形式。
# 函数
cv2.circle(img, (x,y), 半径长度, (0,0,255), -1) // 画一个实心圆(点),最后参数设置为负数
cv2.circle(img, (x,y), 半径长度, (0,0,255), 4) // 画一个空心圆
下图展示了在图像上标记关键点的具体效果:

四、画多边形
多边形绘制在图像分割和OCR(光学字符识别)等任务中十分常见,通常需要通过多个点来描述目标的轮廓。
函数原型如下:
调用cv2.polylines函数,参数包括图像、点集、是否闭合标志以及颜色等。需要注意的是,传入的点集数据类型必须为32位整型(np.int32)。
案例代码:
pot = np.array([(100, 100), (200, 200), (300, 400)], np.int32)
cv2.polylines(img, [pot], True, (0, 0, 255))
# 如果输出填充的多边形,用以下api
cv2.fillPoly(img, [pot], (0, 0, 255))
五、画文本
在实际项目中,文本绘制常用于标记类别标签。将结果以文字形式直接绘制在图像上,有助于直观观察处理结果并进行验证。
函数原型:
使用cv2.putText函数,参数包括图像、要显示的字符串、起始坐标、字体类型、字号大小等。
案例代码:
cv2.putText(img, "Hello World", (100, 100), 字体, 3, (0,0,255))
六、鼠标绘制
实现功能:
该功能支持通过鼠标交互绘制基本图形:按下键盘'l'键切换为画线模式,按下'r'键切换为画矩形模式,按下'c'键切换为画圆模式。
import cv2
import numpy as np
star = (0, 0)
select = 0
img = np.zeros((480, 640, 3), np.uint8)
// 定义鼠标回调函数
def mouse_callback(event, x, y, flags, userdata):
global star,select
if (event & cv2.EVENT_LBUTTONDOWN == cv2.EVENT_LBUTTONDOWN):
star = (x, y)
elif (event & cv2.EVENT_LBUTTONUP == cv2.EVENT_LBUTTONUP):
if select == 0:
cv2.line(img, star, (x, y), (0, 0, 255))
elif select == 1:
cv2.rectangle(img, star, (x, y), (0, 0, 255))
elif select == 2:
a = (x - star[0])
b = (y - star[1])
r = int((a**2+b**2)**0.5)
cv2.circle(img, star, r, (0, 0, 255))
else:
print('no shape')
cv2.namedWindow('drawshape', cv2.WINDOW_NORMAL)
cv2.setMouseCallback('drawshape', mouse_callback, "111")
while True:
cv2.imshow('drawshape', img)
key=cv2.waitKey(1) & 0xFF
if key == ord('q'):
break
elif key == ord('l'):
select = 0
elif key == ord('r'):
select = 1
elif key == ord('c'):
select = 2
下图为随意绘制的结果示例,用户可以在此基础上创作更复杂的图形。

总结
上述内容涵盖了OpenCV中常用的几种图形绘制方法。目前中文文本显示仍存在一定限制(需额外引入字体样式文件),后续文章将对此进行补充。此外,还将进一步学习图形学进阶知识,为后续实战应用做好准备。
到此这篇关于Python OpenCV学习之图形绘制详解的文章就介绍到这了,更多相关Python OpenCV图形绘制内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









