OpenCV 学习7-图像标注

本文主要说明如何在图像上添加标注信息,包括:

  • 在图像上画线
  • 在图像上画圆圈和实心圆
  • 在图像上画矩形
  • 在图像上画文本

1、在图像上画线 cv2.line

1.1 函数定义

python 复制代码
cv2.line(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
  • 参数说明
参数 类型 说明
img NumPy 数组
pt1 tuple (x1, y1) 直线起点坐标(x 坐标,y 坐标)
pt2 tuple (x2, y2) 直线终点坐标(x 坐标,y 坐标)
color tuple 颜色值,BGR 格式,灰度图中为单个整数
thickness int (可选) 线条粗细(像素),默认为 1,负值(如 -1)表示填充(对多边形有用,但对 line 无实际意义)
lineType int (可选) 线型 cv2.LINE_8:8-连通线(默认); cv2.LINE_4:4-连通线; cv2.LINE_AA:抗锯齿线(推荐用于平滑线条)
shift 整数(可选) 坐标点的小数位数,默认为0,用于亚像素精度绘制
  • 注意点

1、颜色顺序是 BGR,对于RGB 颜色,下列代码可以进行转换
color_rgb = (0, 255, 255)
color_bgr = color_rgb[::-1]

2、图像必须可修改:确保传入的图像是可写的
img.flags['WRITEABLE'] == True

1.2 代码示例

python 复制代码
import cv2
import numpy as np
import os

# 1.读取图像
img_path = "img/dog.jpg"
if not os.path.exists(img_path):
    raise FileNotFoundError(f"未找到图像文件{img_path}")

img = cv2.imread(img_path, cv2.IMREAD_COLOR)

# 2.画线条
pointFrom = (100, 100) # 起点坐标
pointTo = (300, 300)   # 终点坐标
color = (0, 0, 255)    # 颜色
thickness = 2      # 线条粗细

cv2.line(img, pointFrom, pointTo, color, thickness, lineType=cv2.LINE_AA)
cv2.imshow('Draw Line', img)

cv2.waitKey(0)
cv2.destroyAllWindows()

2、在图像上画圆圈和实心圆 cv2.circle

2.1 函数定义

复制代码
cv2.circle(img, center, radius, color, thickness=None, lineType=None, shift=None)
  • 参数说明
参数 类型 说明
img NumPy 数组
center 元组 (x, y) 圆心坐标,格式为 (x, y),其中 x 是列方向(宽度),y 是行方向(高度)
radius 整数或浮点数 圆的半径(单位:像素),非负值。
color tuple 颜色值,BGR 格式,灰度图中为单个整数
thickness 整数(可选) 圆轮廓的粗细(像素数),默认值为 1: 正数:仅绘制边框 -1 或负数:填充整个圆(实心圆)
lineType 枚举值(可选) 线条类型,控制渲染质量: cv2.LINE_8:8-邻接(默认) cv2.LINE_4:4-邻接 cv2.LINE_AA:抗锯齿线,用于高质量显示
shift 整数(可选) 圆心坐标和半径值中的小数位数(默认=0),用于亚像素精度绘制

2.2代码示例

python 复制代码
# 2.画圆圈
# 圆心
circle_center = (200,200)
# 半径
radius =100
color = (0, 0, 255)    # 颜色
thickness = 2      # 线条粗细
cv2.circle(img, circle_center, radius, color, thickness, lineType=cv2.LINE_AA) 

3、在图像上画矩形cv2.rectangle

3.1 函数定义

复制代码
cv2.rectangle(img, pt1, pt2, color, thickness=1, lineType=cv2.LINE_8, shift=0)
  • 参数说明
参数 类型 说明
img NumPy 数组
pt1 元组 (x1, y1) 矩形的左上角顶点坐标,格式为 (x, y)(列, 行)
pt2 元组 (x2, y2) 矩形的右下角顶点坐标
color tuple 颜色值,BGR 格式,灰度图中为单个整数
thickness 整数(可选) 边框的粗细(像素数),默认值为 1: 正数:仅绘制边框 -1 或负数:填充整个矩形区域(实心矩形)
lineType 枚举值(可选) 线条类型,控制渲染质量: cv2.LINE_8:8-邻接(默认) cv2.LINE_4:4-邻接 cv2.LINE_AA:抗锯齿线,用于高质量显示
shift 整数(可选) 坐标点的小数位数(默认=0),用于亚像素精度绘制

3.2 代码示例

python 复制代码
# 2.画矩形
start_point =(50,50)
end_point =(500,500)
color = (0, 0, 255)    
thickness = 2      
cv2.rectangle(img, start_point, end_point, color, thickness, lineType=cv2.LINE_8)

4、在图像上画椭圆cv2.ellipse

4.1 函数定义

复制代码
cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color, thickness=1, lineType=cv2.LINE_8, shift=0)
  • 参数说明
参数 类型 说明
img NumPy 数组
center 元组 (x, y) 椭圆中心坐标(整数或浮点数)
axes 元组 (major_axis, minor_axis) 椭圆轴的长度
angle 浮点数 椭圆旋转角度(顺时针,单位:度),表示主轴相对于水平方向的夹角
startAngle 浮点数 起始弧度角(单位:度),从主轴开始逆时针测量
endAngle 浮点数 结束弧度角(单位:度)
color tuple 颜色值,BGR 格式,灰度图中为单个整数
thickness 整数(可选) 线条粗细,默认值为 1: 正数:绘制轮廓 -1 或负数:填充整个形状(实心椭圆或扇形)
lineType 枚举值(可选) 线条类型,控制渲染质量: cv2.LINE_8:8-邻接(默认) cv2.LINE_4:4-邻接 cv2.LINE_AA:抗锯齿线,用于高质量显示
shift 整数(可选) 中心坐标和轴值中的小数位数(默认=0),用于亚像素精度绘制

4.2代码示例

python 复制代码
# 2.绘制圆
# 圆心坐标
ellipse_center = (200,200)
axis1 = (100,50)
axis2 = (120,80)
color1 = (0, 0, 255)
color2 = (0, 255, 0)
thickness = 2

cv2.ellipse(img, ellipse_center, axis1, 0, 0, 360, color1, thickness)
cv2.ellipse(img, ellipse_center, axis2, 90, 0, 270, color2, thickness)

5、在图像上画文本cv2.putText

5.1 函数定义

复制代码
cv2.putText(img, text, org, fontFace, fontScale, color, thickness=1, lineType=cv2.LINE_8, bottomLeftOrigin=False)
  • 参数说明
参数 类型 说明
img NumPy 数组
text 字符串 str 要绘制的文字内容
org 元组 (x, y) 文本左下角起点坐标(baseline 的位置)
fontFace 枚举值或整数 字体类型,决定文字样式。常用选项: cv2.FONT_HERSHEY_SIMPLEX:普通无衬线字体 cv2.FONT_HERSHEY_PLAIN:小号简洁字体 cv2.FONT_HERSHEY_DUPLEX:双倍高度字体
fontScale 浮点数 字体缩放因子,控制字体大小: 1.0 表示原始大小 2.0 表示放大两倍
color tuple 颜色值,BGR 格式,灰度图中为单个整数
thickness 整数(可选) 文字笔画粗细(像素数),默认为 1
lineType 枚举值(可选) 线条类型,控制渲染质量: cv2.LINE_8:8-邻接(默认) cv2.LINE_4:4-邻接 cv2.LINE_AA:抗锯齿线,用于高质量显示
bottomLeftOrigin 布尔值(可选) 是否从图像左下角为原点(像数学坐标系) False(默认):标准图像坐标系(左上为原点) True:y 向下为负(极少使用)

5.2 代码示例

python 复制代码
text = 'This is a dog!'
org = (50,50)
color = (0, 0, 255)

cv2.putText(img, text, org, fontFace = cv2.FONT_HERSHEY_SIMPLEX, fontScale = 1.5, color = (0, 0, 255), thickness = 2, lineType = cv2.LINE_AA)
相关推荐
richard_yuu6 小时前
OpenCV 实战第 15 篇:G-API 图计算,工业流水线的 CPU/GPU 混合执行
人工智能·opencv·计算机视觉
老唐7777 小时前
OpenCV5实测:纯CPU跑YOLO26目标检测
图像处理·人工智能·opencv·yolo·目标检测·计算机视觉
把我格子衫拿来9 小时前
PnP 位姿估计:从二维像素求三维姿态,为什么 tvec 不是相机位置?
python·opencv·计算机视觉·pnp·相机位姿
晨间晓9 小时前
图片边缘主要朝哪里?用华为云码道开发 OpenCV 梯度方向分析工具
人工智能·opencv·华为云
把我格子衫拿来9 小时前
手眼标定:相机与机械臂如何建立坐标关系?从 AX=XB 到 OpenCV 实践
python·opencv·机器人·手眼标定·坐标变换
晨间晓9 小时前
图片是什么色调?用华为云码道开发 OpenCV HSV 色调分布分析工具
人工智能·opencv·华为云
把我格子衫拿来9 小时前
相机标定误差很小,为什么测量仍不准?从 OpenCV 重投影误差到独立验证
python·数码相机·opencv·计算机视觉·相机标定
晨间晓1 天前
图片到底有多亮?用华为云码道开发 OpenCV 亮度分析工具
人工智能·opencv·华为云
晨间晓1 天前
图片对比度够不够?用华为云码道开发 OpenCV 对比度分析工具
人工智能·opencv·华为云
HUANGZHENXUAN1231 天前
代码解析(四):task3_serial/ —— 用 3002 条真实报文做一次逐行自证
opencv·github