【youcans 的 OpenCV 例程 300篇】254.OpenCV 绘制图像标记

news2024/12/25 15:11:40

『youcans 的 OpenCV 例程300篇 - 总目录』


【youcans 的 OpenCV 例程 300篇】254. OpenCV 绘制标记


7.1 绘图函数基本参数

OpenCV提供了绘图功能,可以在图像上绘制直线、矩形、圆、椭圆等各种几何图形。

函数 cv.line()、cv.rectangle()、cv.circle()、cv.polylines() 等分别用来在图像中绘制直线、矩形、圆形、多边形等几何形状,这些绘图函数中有一些的设置参数,介绍如下:

  • img:输入输出图像,格式不限
  • color:绘图线条的颜色,(b,g,r) 格式的元组,或者表示灰度值的标量
    • thickness:绘制线条的粗细,默认值 1px,-1 表示内部填充
  • lineType:绘制线段的线性,默认为 LINE_8
    • cv.FILLED:内部填充(实心图形)
    • cv.LINE_4:4 邻接线型
    • cv.LINE_8:8 邻接线型
    • cv.LINE_AA:抗锯齿线型,图像更平滑
  • shift:点坐标的小数位数,默认为 0

7.2 绘制标记

函数原型:

函数 cv.drawMarker 用来在图像上的指定位置绘制标记。

cv.drawMarker(img, position, color[, markerType=MARKER_CROSS, markerSize=20, thickness=1, line_type=8]) → img

参数说明:

  • img:输入输出图像,允许单通道灰度图像或多通道彩色图像
  • position:标记点的坐标,(x1, y1) 格式的元组
  • color:绘制标记的颜色
  • markerType:标记类型,默认为 cv.MARKER_CROSS(十字标记)
    • cv.MARKER_CROSS:十字标记(类似加号),+
    • cv.MARKER_TILTED_CROSS:,倾斜的十字标记(类似乘号), × \times ×
    • cv.MARKER_STAR:星形标记(类似米字), ★ \bigstar
    • cv.MARKER_DIAMOND:钻石菱形标记, ⋄ \diamond
    • cv.MARKER_SQUARE:方块标记, □ \Box
    • cv.MARKER_TRIANGLE_UP:上三角标记, △ \triangle
    • cv.MARKER_TRIANGLE_DOWN:下三角标记, ▽ \triangledown
  • markerSize:标记的轴向长度,默认值 20pixels

注意事项:

  1. 绘图操作会直接对传入的图像 img 进行修改,是否接受函数返回值都可以。如果要保持输入图像不变则要用 img.copy() 进行复制。

例程 A4.15:在图像上绘制标记

本例程示例在图像上绘制标记。

    # A4.15 绘制标记
    img = np.ones((600, 800, 3), np.uint8)*205
    for i in range(7):  # 7 种标记
        cx = 100*(i+1)
        color = (0,0,255)
        cv.drawMarker(img, (cx, 100), color, markerType=i, markerSize=10)
        cv.drawMarker(img, (cx, 200), color, markerType=i, markerSize=20)
        cv.drawMarker(img, (cx, 300), color, markerType=i, markerSize=30)
        cv.drawMarker(img, (cx, 400), color, markerType=i, markerSize=40)
        cv.drawMarker(img, (cx, 500), color, markerType=i, markerSize=50)

    plt.figure(figsize=(9, 4))
    plt.subplot(121), plt.title("Draw marker"), plt.axis('off')
    plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
    plt.subplot(122), plt.title("Draw marker"), plt.axis('off')
    plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
    plt.tight_layout()
    plt.show()

在这里插入图片描述


** 延伸阅读**

7.3 绘制直线

函数原型

函数 cv.line() 用来在图像中绘制直线,函数 cv.arrowedLine() 用来在图像中绘制带箭头直线。

cv.line(img, pt1, pt2, color[, thickness=1, lineType=LINE_8, shift=0]) → img
cv.arrowedLine(img, pt1, pt2, color[, thickness=1, line_type=8, shift=0, tipLength=0.1]) → img

函数 cv.line() 绘制图像中点 pt1 与点 pt2 之间的线段,函数 cv.arrowedLine() 绘制图像中点 pt1 与点 pt2 之间的带箭头线段。

参数说明:

  • img:输入输出图像,允许单通道灰度图像或多通道彩色图像
  • pt1:线段第一个点的坐标,(x1, y1)
  • pt2:线段第二个点的坐标,(x2, y2)
  • tipLength:箭头部分长度与线段长度的比例,默认为 0.1

7.4 绘制矩形

函数原型:

函数 cv.rectangle() 用来在图像上绘制垂直于图像边界的矩形。

cv.rectangle(img, pt1, pt2, color[, thickness=1, lineType=LINE_8, shift=0]) → img
cv.rectangle(img, rec, color[, thickness=1, lineType=LINE_8, shift=0]) → img

参数说明:

  • img:输入输出图像,允许单通道灰度图像或多通道彩色图像

  • pt1:矩阵第一个点的坐标,(x1, y1) 格式的元组

  • pt2:与 pt1 成对角的矩阵第二个点的坐标,(x2, y2) 格式的元组

  • color:绘图线条的颜色,(b,g,r) 格式的元组,或者表示灰度值的标量

  • thickness:绘制矩形的线宽,默认值 1px,负数表示矩形内部填充

  • lineType:绘制线段的线性,默认为 LINE_8

  • shift:点坐标的小数位数,默认为 0


例程 A4.3:在图像上绘制倾斜的矩形

cv.rectangle 只能在图像上绘制垂直于边界的矩形。如果需要绘制倾斜的矩形,则要获得倾斜矩形的各个顶点坐标,通过绘制直线构造成为闭合的矩形。

    # A4.3 在图像上绘制倾斜的矩形
    height, width, channels = 600, 400, 3
    img = np.ones((height, width, channels), np.uint8)*192  # 创建黑色图像 RGB=0

    # 围绕矩形中心旋转
    x, y, w, h = (100, 200, 200, 100)  # 左上角坐标 (x,y), 宽度 w,高度 h
    cx, cy = x+w//2, y+h//2  # 矩形中心
    img1 = img.copy()
    cv.circle(img1, (cx,cy), 4, (0,0,255), -1)  # 旋转中心
    angle = [15, 30, 45, 60, 75, 90]  # 旋转角度,顺时针方向
    for i in range(len(angle)):
        ang = angle[i] * np.pi / 180
        x1 = int(cx + (w/2)*np.cos(ang) - (h/2)*np.sin(ang))
        y1 = int(cy + (w/2)*np.sin(ang) + (h/2)*np.cos(ang))
        x2 = int(cx + (w/2)*np.cos(ang) + (h/2)*np.sin(ang))
        y2 = int(cy + (w/2)*np.sin(ang) - (h/2)*np.cos(ang))
        x3 = int(cx - (w/2)*np.cos(ang) + (h/2)*np.sin(ang))
        y3 = int(cy - (w/2)*np.sin(ang) - (h/2)*np.cos(ang))
        x4 = int(cx - (w/2)*np.cos(ang) - (h/2)*np.sin(ang))
        y4 = int(cy - (w/2)*np.sin(ang) + (h/2)*np.cos(ang))
        color = (30*i, 0, 255-30*i)
        cv.line(img1, (x1,y1), (x2,y2), color)
        cv.line(img1, (x2,y2), (x3,y3), color)
        cv.line(img1, (x3,y3), (x4,y4), color)
        cv.line(img1, (x4,y4), (x1,y1), color)

    # 围绕矩形左上顶点旋转
    x, y, w, h = (200, 200, 200, 100)  # 左上角坐标 (x,y), 宽度 w,高度 h
    img2 = img.copy()
    cv.circle(img2, (x, y), 4, (0,0,255), -1)  # 旋转中心
    angle = [15, 30, 45, 60, 75, 90, 120, 150, 180, 225]  # 旋转角度,顺时针方向
    for i in range(len(angle)):
        ang = angle[i] * np.pi / 180
        x1, y1 = x, y
        x2 = int(x + w * np.cos(ang))
        y2 = int(y + w * np.sin(ang))
        x3 = int(x + w * np.cos(ang) - h * np.sin(ang))
        y3 = int(y + w * np.sin(ang) + h * np.cos(ang))
        x4 = int(x - h * np.sin(ang))
        y4 = int(y + h * np.cos(ang))
        color = (30 * i, 0, 255 - 30 * i)
        cv.line(img2, (x1, y1), (x2, y2), color)
        cv.line(img2, (x2, y2), (x3, y3), color)
        cv.line(img2, (x3, y3), (x4, y4), color)
        cv.line(img2, (x4, y4), (x1, y1), color)

    plt.figure(figsize=(9, 6))
    plt.subplot(121), plt.title("img1"), plt.axis('off')
    plt.imshow(cv.cvtColor(img1, cv.COLOR_BGR2RGB))
    plt.subplot(122), plt.title("img2"), plt.axis('off')
    plt.imshow(cv.cvtColor(img2, cv.COLOR_BGR2RGB))
    plt.show()

例程结果:
在这里插入图片描述


7.5 绘制圆形

函数原型:

函数 cv.circle() 用来在图像上绘制圆形。

cv.circle(img, center, radius, color[, thickness=1, lineType=LINE_8, shift=0]) → img

参数说明:

  • img:输入输出图像,允许单通道灰度图像或多通道彩色图像

  • center:圆心点的坐标,(x, y) 格式的元组

  • radius:圆的半径,整数

  • color:绘图线条的颜色,(b,g,r) 格式的元组,或者表示灰度值的标量

  • thickness:绘制矩形的线宽,默认值 1px,负数表示矩形内部填充

  • lineType:绘制线段的线性,默认为 LINE_8

  • shift:点坐标的小数位数,默认为 0


7.4 绘制椭圆

函数原型:

函数 cv.ellipse() 用来在图像上绘制椭圆轮廓、填充椭圆、椭圆弧或填充椭圆扇区。

cv.ellipse(img, center, axes, angle, startAngle, endAngle, color[, thickness=1, lineType=LINE_8, shift=0]) → img
cv.ellipse(img, box, color[, thickness=1, lineType=LINE_8]) → img

参数说明:

  • img:输入输出图像,允许单通道灰度图像或多通道彩色图像
  • center:椭圆中心点的坐标,(x, y) 格式的元组
  • axes:椭圆半轴长度,(hfirst, hsecond) 格式的元组
  • angle: 椭圆沿 x轴方向的旋转角度(角度制,顺时针方向)
  • startAngle:绘制的起始角度
  • endAngle:绘制的终止角度
  • box:通过 RotatedRec 类表示椭圆
  • color:绘图线条的颜色,(b,g,r) 格式的元组,或者表示灰度值的标量
  • thickness:绘制矩形的线宽,默认值 1px,负数表示矩形内部填充
  • lineType:绘制线段的线性,默认为 LINE_8
  • shift:点坐标的小数位数,默认为 0
    # A4.6 基于多段线绘制近似椭圆
    img = np.ones((400, 600, 3), np.uint8)*224

    cx, cy = 100, 150
    halfAxesLength = (70, 40)
    angle, startAng, endAng = 30, 0, 360
    delta = [10, 20, 30, 40]
    for i in range(len(delta)):
        color = (i*60, i*60, 255-i*60)
        pts = cv.ellipse2Poly((cx+140*i, cy), halfAxesLength, angle, startAng, endAng, delta[i])  # (351,2)
        points = np.array(pts)
        cv.polylines(img, [points], True, color, thickness=1)  # 绘制近似多边形
        points[:,1] += 160
        cv.fillPoly(img, [points], color)  # 绘制填充近似多边形
        text1 = "delta={}".format(delta[i])
        text2 = "num={}".format(pts.shape)
        cv.putText(img, text1, (140*i+25, 30), cv.FONT_HERSHEY_SIMPLEX, 0.5, 255)
        cv.putText(img, text2, (140*i+25, 50), cv.FONT_HERSHEY_SIMPLEX, 0.5, 255)
        print(pts.shape, points.shape)

    plt.figure(figsize=(9, 6))
    plt.title("Polygon approximated ellipse"), plt.axis('off')
    plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
    plt.show()

在这里插入图片描述

【本节完】

版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/128466627)
Copyright 2022 youcans, XUPT
Crated:2023-1-2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/138260.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习:08 训练、测试和验证集的说明

目录 用于深度学习的数据集 训练集 验证集 测试集 总结 用于深度学习的数据集 接下来,我将在这篇里面讨论在训练和测试神经网络期间使用的不同数据集。 出于模型的训练和测试目的,我们应该将数据分解为三个不同的数据集。这些数据集将包含以下内容…

【小f的刷题笔记】(JS)阶乘 - 阶乘后的零 LeetCode172 阶乘函数后K个零 LeetCode793

【阶乘】 一、阶乘后的零: LeetCode172 链接: 172.阶乘后的零 题目: 思路: 0的产生是一定是因为2*5产生的,所以就是找因数 并且,可想而知,找的到因数5,必然找的到因数2与之搭配…

【MySQL】深入理解B+树索引

文章目录1. 前言2. 索引方案3. InnoDB的索引方案4. 索引的分类4.1 聚簇索引4.2 二级索引4.3 联合索引5. InnoDB中的B树索引的注意事项5.1 内节点中目录项记录的唯一主5.2 一个页至少容纳2条记录6. MyISAM中的索引⽅案简单介绍1. 前言 索引,是MySQL快速查询的秘籍。…

ARMv8/ARMv9:深入理解MPIDR_EL1寄存器中的affinity

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】:【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈官方文档(ARM ARM文档)的介绍如下所示 翻译一下MPIDR_EL1相关的英文,如下所示: 作用: 在多处理器系统中,为调…

Xshell 连接虚拟机(Ubuntu、CentOS)

对于一些linux的初学者来说,在没有自己的服务器时可以选择使用虚拟机来代替(如ubuntu、centos等)进行相关的学习。下面介绍下如何使用xshell来远程连接虚拟机。 注意:下面我以Ubuntu来举例说明。 1、创建虚拟机 虚拟机的创建网络…

1、数据库安装修改root密码管理自启服务

MySQL的下载和安装 登录MySQL官网下载MySQL.zip包 MySQL :: Download MySQL Community Server 下载完毕可自行选择存储位置,进行解压 解压后配置环境变量 完成配置后在MySQL目录下新建一个my.ini配置文件 文件写入以下内容 [client] # 设置mysql客户端默认字符集…

面向对象2(static修饰变量和方法、Javabean类、测试类和工具类、对main方法的理解、继承、子类继承父类构造方法变量和方法)

1、static修饰变量和方法 JDK8以前,静态区在方法区里面,JDK8开始,静态区挪到了堆内存当中 理解: 因为静态方法没有this,而非静态方法是有一个隐含的参数this的,所以想在静态方法里面调用非静态变量或方法就…

电子招标采购系统源码之传统采购模式面临的挑战

采购类型多 采购制度:采购金额、部门、品类的差异导致管理标准不同。 采购流程:从供应商管理、寻源操作到合同签订、订单执行,业务流程长,审批节点多,传统管理透明度低,联动性差。 供应商管理难 寻源&#…

亚马逊云科技 Build On - Serverless助力企业降本增效

亚马逊云科技 Build On - Serverless开启零售新篇章梅开三度活动体验实验问题总结一点建议咖啡案例实验Serverless学习总结梅开三度 Hi,作为一名Builder,这也是第三次参加由AWS&CSDN共同举办的Build On活动,跟前几期一样,活动举办方也是…

Java集合ArrayList-学习笔记

目录 ArrayList 集合和数组的优势对比: 1.1 ArrayList类概述 1.2 ArrayList类常用方法 1.3 ArrayList存储字符串并遍历 1.4 ArrayList存储学生对象并遍历 1.5 查找用户的索引 1.6 判断用户的是否存在 ArrayList 集合和数组的优势对比: 集合长度可…

Ardupilot EKF3核心算法《状态量速度与位置预测方程》

目录 文章目录 目录摘要1. Ardupilot EKF3核心算法《状态量速度预测方程》2. Ardupilot EKF3核心算法《状态量位置预测方程》3. Ardupilot EKF3核心算法《状态量速度与位置预测方程》摘要 本节主要记录Ardupilot EKF3核心算法《状态量速度与位置预测方程》的过程,欢迎批评指正…

mysql生产数据库被误删

23年的头一天上班安装数据库,因为ssh工具来回切换失误,犯下不可饶恕的错误,居然将生产数据库全部删除,工作十几年头一次干这种蠢事,第一时间反应是一世英名毁于一旦,赶紧跑路。第二反应还是想办法看能否挽回…

aws eks 使用 cloudformation 创建并更新自管节点组

参考资料 更新现有自行管理的节点组 使用eks自管节点组能够最大程度控制节点的各项配置和参数,包括并不限于ami,节点类型等 但是使用自管节点也给用户带来了较大的维护和更新成本。对于节点组的更新操作,我们可以使用cloudformation的方式…

速览Visual Studio 2022 中的新增功能

目录 性能改进 Visual Studio 2022 为 64 位 在文件中更快地查找 Git 工具速度更快 生成新式应用 适用于 C、.NET 和热重载的更佳开发工具 Blazor & 的汇报ASP.NET 的 Razor 编辑器 热重载 创新触手可及 Git 多存储库支持和行暂存支持 IntelliCode 改进 为每个…

魔方(15)二、三、四、五阶棋盘魔方

棋盘魔方 这价格实在可恶,于是我拿现成的魔方自己贴贴纸。 二阶棋盘魔方A 有4个角块是3面黑,4个角块是3面白,而6个面都是棋盘色。 只需要2步就可以转化成: 所以任意状态只要转化成这个状态再加2步就能复原了。 二阶棋盘魔方B&a…

【C++函数对象】STL基础语法学习 | 仿函数谓词内建仿函数

目录 ●仿函数 1.概念 2.使用 ●谓词 1.一元谓词 2.二元谓词 ●内建仿函数 1.算数仿函数 2.关系仿函数 3.逻辑仿函数 ●仿函数 1.概念 重载函数调用操作符的类,其对象常称为函数对象。函数对象使用重载的()时,行为类似函数的调用,所…

技术更高,设计更远:华为全屋智能设计大赛的审美之跃

“人生到处知何以?应似飞鸿踏雪泥。泥上偶然留指爪,鸿飞那复计东西。”很多设计师朋友跟我说,苏轼这首《和子由渑池怀旧》是对设计与审美的最高理解。好的设计,应该仅仅留下一点点痕迹,同时在简约的表象下隐含大量的审…

高通平台开发系列讲解(USB篇)USB调试手段汇总说明 - 视频课

文章目录 一、USB AT数据流说明二、BUS Hound 工具说明三、sysfs相关USB调试节点四、USB usbmon工具使用五、USB usbmon日志解析六、UsbTreeView软件的使用七、视频讲解分享沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 碰见USB AT不通怎么办?所以本篇章汇总了高通…

Vue与React中父子组件生命周期的执行顺序?【生命周期详细知识讲解!!!】

文章目录一、 Vue中父子组件生命周期1-1 加载渲染过程1-2 销毁过程1-3 展示案例二、 React中父子组件生命周期2-1 关于React新旧版生命周期介绍2-2 父子组件生命周期2-2-1 父子组件初始化2-2-2 子组件修改自身state2-2-3 父组件修改props2-2-4 卸载子组件一、 Vue中父子组件生命…

卷绕剩余长度计算FC(收放卷应用)

卷径实时计算方法详细内容请参看下面的文章链接: 卷径计算详解(通过卷绕的膜长和膜厚进行计算)_RXXW_Dor的博客-CSDN博客有关卷绕+张力控制可以参看专栏的系列文章,文章链接如下:变频器简单张力控制(线缆收放卷应用)_RXXW_Dor的博客-CSDN博客_收放卷应用张力控制的开闭环…