《数字图像处理-OpenCV/Python》连载(22)绘制直线与线段

news2024/11/27 23:35:08

《数字图像处理-OpenCV/Python》连载(22)绘制直线与线段


本书京东优惠购书链接:https://item.jd.com/14098452.html
本书CSDN独家连载专栏:https://blog.csdn.net/youcans/category_12418787.html

在这里插入图片描述


第 4 章 绘图与鼠标交互


本章介绍OpenCV的绘图功能和简单的鼠标交互处理方法。与Excel或Matplotlib中的可视化数据图不同,OpenCV中的绘图功能主要用于在图像的指定位置绘制几何图形。


本章内容概要

  • 学习OpenCV绘图的基本方法和参数。
  • 通过学习OpenCV绘图函数,能在图像上绘制直线、矩形、圆形和多边形等,以及在图像上添加文字和符号。
  • 介绍鼠标交互操作方法,通过鼠标、键盘与显示图像的实时交互获取数据。

4.2 绘制直线与线段

函数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。

注意问题
(1) 绘图操作能直接对输入图像进行修改,绘制的线段能叠加到输入图像上。函数语法无须接受函数的返回值。
(2) 绘制起点pt1和终点pt2之间的线段,注意坐标格式为(x, y),而不是(y, x)。
(3) 如果起点或终点坐标超出了图像边界,则要以图像边界对绘制的线段进行裁剪。此时,线段的端点为线段与图像边界的交点,不显示越界的线段或箭头。
(4) 箭头从起点pt1指向终点pt2,通过交换起点与终点并重复绘制,可以绘制带双向箭头的线段。
(5) 箭头与直线的夹角是45度,tipLength表示箭头部分长度与线段长度的比例。


【例程0401】绘制直线与线段

本例程用于在图像上绘制直线与线段,注意对照程序注释与显示结果比较参数的影响。


# 【0401】绘制直线与线段
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

if __name__ == '__main__':
    height, width, channels = 180, 200, 3
    img = np.ones((height, width, channels), np.uint8) * 160  # 创建灰色图像

    # (1) 线条参数 color 的设置
    # 注意 pt1、pt2 坐标格式是 (x,y),而不是 (y,x)
    img1 = img.copy()  # 绘图函数就地操作,修改输入图像
    cv.line(img1, (0,0), (200,180), (0,0,255), 1)  # 红色 R=255
    cv.line(img1, (0,0), (100,180), (0,255,0), 1)  # 绿色 G=255
    cv.line(img1, (0,40), (200,40), (128,0,0), 2)  # 深蓝 B=128
    cv.line(img1, (0,80), (200,80), 128, 2)  # color=128 等效于 (128,0,0)
    cv.line(img1, (0,120), (200,120), 255, 2)  # color=255 等效于 (255,0,0)

    # (2) 线宽的设置
    # 如果设置了 thickness,则关键词 "lineType" 可以省略
    img2 = img.copy()
    cv.line(img2, (20,50), (180,10), (255,0,0), 1, cv.LINE_8)  # 绿色
    cv.line(img2, (20,90), (180,50), (255,0,0), 1, cv.LINE_AA)  # 绿色
    # 如果没有设置 thickness,则关键词 "lineType" 不能省略
    cv.line(img2, (20,130), (180,90), (255,0,0), cv.LINE_8)  # 蓝色,函数cv.line 被识别为线宽
    cv.line(img2, (20,170), (180,130), (255,0,0), cv.LINE_AA)  # 蓝色,函数cv.line 被识别为线宽

    # (3) tipLength 指箭头部分长度与整个线段长度的比例
    img3 = img.copy()
    img3 = cv.arrowedLine(img3, (20,20), (180,20), (0,0,255), tipLength=0.05)  # 从 pt1 指向 pt2
    img3 = cv.arrowedLine(img3, (20,60), (180,60), (0,0,255), tipLength=0.1)
    img3 = cv.arrowedLine(img3, (20,100), (180,100), (0,0,255), tipLength=0.15)  # 双向箭头
    img3 = cv.arrowedLine(img3, (180,100), (20,100), (0,0,255), tipLength=0.15)  # 交换 pt1、pt2
    img3 = cv.arrowedLine(img3, (20,140), (210,140), (0,0,255), tipLength=0.2)  # 终点越界,箭头未显示

    # (4) 没有复制原图像,直接改变输入图像的 img,可能导致它们相互影响
    img4 = cv.line(img, (0,100), (150,100), (0,255,0), 1)  # 水平线,y=100
    img5 = cv.line(img, (75,0), (75,200), (0,0,255), 1)  # 垂直线,x=75

    # (5) 灰度图像上只能绘制灰度线条,参数 color 只有第一通道值有效
    img6 = np.zeros((height, width), np.uint8)  # 创建灰度图像
    cv.line(img6, (0,10), (200,10), (0,255,255), 2)  # Gray=0
    cv.line(img6, (0,30), (200,30), (64,128,255), 2)  # Gray=64
    cv.line(img6, (0,60), (200,60), (128,64,255), 2)  # Gray=128
    cv.line(img6, (0,100), (200,100), (255,0,255), 2)  # Gray=255
    cv.line(img6, (20,0), (20,200), 128, 2)  # Gray=128
    cv.line(img6, (60,0), (60,200), (255,0,0), 2)  # Gray=255
    cv.line(img6, (100,0), (100,200), (255,255,255), 2)  # Gray=255
    print(img6.shape, img6.shape)

    plt.figure(figsize=(9, 6))
    plt.subplot(231), plt.title("1. img1"), plt.axis('off')
    plt.imshow(cv.cvtColor(img1, cv.COLOR_BGR2RGB))
    plt.subplot(232), plt.title("2. img2"), plt.axis('off')
    plt.imshow(cv.cvtColor(img2, cv.COLOR_BGR2RGB))
    plt.subplot(233), plt.title("3. img3"), plt.axis('off')
    plt.imshow(cv.cvtColor(img3, cv.COLOR_BGR2RGB))
    plt.subplot(234), plt.title("4. img4"), plt.axis('off')
    plt.imshow(cv.cvtColor(img4, cv.COLOR_BGR2RGB))
    plt.subplot(235), plt.title("5. img5"), plt.axis('off')
    plt.imshow(cv.cvtColor(img5, cv.COLOR_BGR2RGB))
    plt.subplot(236), plt.title("6. img6"), plt.axis('off')
    plt.imshow(img6, cmap="gray")
    plt.tight_layout()
    plt.show()

程序说明:
(1) 运行结果,绘制直线与线段如图4-1所示,注意要对照程序注释与显示的图像比较不同参数的影响。
(2) 在没有设置 thickness时关键词lineType不能省略,否则函数cv.line 将被识别为线宽(见图4-1(2))。
(3) 由于绘图函数就地操作,修改了输入图像,导致图4-1(4)和图4-1(5)所示的绘制结果相互影响。

在这里插入图片描述
图4-1 绘制直线与线段


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

欢迎关注本书CSDN独家连载专栏
《数字图像处理-OpenCV/Python》连载: https://blog.csdn.net/youcans/category_12418787.html

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

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

相关文章

Http/https代理和抓包分析

前言 最近工作需要部署http/https的代理,所以用squid部署了一下,重新回顾了一下http和https的代理知识。 HTTP代理 根据《HTTP 权威指南》如图: 这种情况下,对访问服务器而言,它会把代理当做客户端,完全…

C++算法:前缀和基础

相关 源码测试用例下载 https://download.csdn.net/download/he_zhidan/88430716 包括4个压缩包,初始代码,实现前缀和,实现前缀积,实现前缀异或。都是在前者的基础上修改的。 本博文是CSDN学院课程的讲义 https://edu.csdn.net/c…

【linux kernel】linux的platform设备驱动框架分析

文章目录 一、简介二、platform总线三、platform设备和驱动的匹配过程四、platrom驱动和platform设备五、platform驱动设计六、代码示例 🔺【linux内核系列文章】 👉对一些文章内容进行了勘误,本系列文章长期不定时更新,希望能分享…

可视化上证50结构图

可视化上证50结构图 缘由收集数据先获取50支成分股列表获取各成分股票K线数据 数据处理找出来,再删除,然后重新下载数据最终获得每日报价的变化值 图形结构处理聚类分析使用affinity_propagation(亲和传播)聚类 嵌入二维平面空间可视化小结热力图 缘由 …

Excel和图片如何互相转换?有何技巧?

一、将图片转为excel表格 首先,打开金鸣识别网站,点击“点击添加需转换的图片或PDF”按钮,添加待识别的图片或PDF文件。 添加完待识别的图片或PDF后,点击“提交识别”按钮,程序便开始识别。 识别完成后,系…

无效的 page.json [“window“] 页面.json配置了“window“: {“disableScroll“: true}

问题:启动小程序时报错 无效的 page.json ["window"] 页面 解决: app.json 全局配置才使用window对象,在单独的页面直接写disableScroll:true即可 //app.json中添加,window里面添加就可以了 "window": { …

儿童写作业用的护眼灯哪种好?双十一写作业护眼灯推荐

这些年大家对于身体健康越来越重视,尤其是关于儿童青少年的眼睛健康问题,因此作为学生们常用的护眼台灯也成为了非常多家长为孩子选择的学习台灯。而还没给孩子准备台灯的家长们也都想买上一盏台灯给孩子使用,但市面上的护眼台灯太多了&#…

【ElasticSearch】学习笔记

【ElasticSearch】学习笔记 【一】ElasticSearch是什么?【二】Mac安装ElasticSearch【三】Mac安装可视化界面Kibana 【一】ElasticSearch是什么? ElasticSearch是一个分布式、Restful风格的搜索和数据分析引擎,Stark的核心。 可以应用在比如…

XnViewMP forMac/Windows中文版:轻松管理和浏览您的图片库

您是否厌倦了使用不方便、功能有限的图片浏览软件?现在,让我向您介绍一款强大而全面的图片浏览软件——XnViewMP! XnViewMP是一款免费开源的跨平台图片浏览软件,它具有出色的功能和易用性,适用于个人用户和专业摄影师…

助力森林火情预警检测,基于YOLOv7-tiny、YOLOv7和YOLOv7x开发构建无人机航拍场景下的森林火情检测是别预警系统

火情的预警与检测识别对于保障林业安全,减少人员伤亡有着重要的意义,科学有效地早发现早扑灭是最有效的干预手段,本文的主要是想就是想要建立基于无人机航拍场景下的森林火情检测预警系统,整体效果如下所示: 这里文中选…

TikTok整合谷歌搜索功能,探索新的流量入口

随着社交媒体平台的不断崛起和发展,用户们的需求也在不断演变。如今,人们不仅仅是在社交媒体上分享自己的生活点滴,还希望从中获取更多有用的信息。 因此,社交媒体平台正积极寻找与搜索引擎的整合方式,以满足用户的多…

小程序开发平台源码系统+万能门店小程序功能+完整的搭建教程

大家好啊,今天来给大家分享一个小程序开发平台,这款平台源码系统中包含了万能门店小程序功能,一起来看看吧。 系统特色功能一览: 全端覆盖:独立版万能门店全端云小程序可以一键生成全端小程序,包括微信小程…

2023_Spark_实验十三:Spark RDD 求员工工资总额

一、主题:Spark RDD 求员工工资总额及排名 问题提出:近三年来,全球新冠疫情已经严重影响了现有经济情况,公司高层领导对公司运行情况进行深入了解,需要了解每个部门的人力成本,以至于更加合理的优化人力资…

从头开始机器学习:神经网络

一、说明 如果你还没有做过逻辑回归,你会在这里挣扎。我强烈建议在开始之前查看它。您在逻辑回归方面的能力将影响您学习神经网络的难易程度和速度。 二、神经网络简介 神经网络是一个神经元网络。这些神经元是逻辑回归函数,它们被链接在一起形成一个网络…

vim基础命令批量替换

正常模式 v(小写)正常模式下面会出现VISUAL,可以可以选择指定连续区域可以随意选择,这个用的最多 ctrl v(小写) 这个可以类似于sublime这种按照固定前几个字符选择 最后一列哪个a其实已经选择了&#xf…

论文导读 | 八月下旬特征选择专题期刊精选

推文作者:丰于杭 编者按 在“八月下旬特征选择专题期刊精选”中,我们有主题、有针对性地选择了MSOM, Operations Research, Management Science等管理科学杂志中一些有趣的文章,不仅对文章的内容进行了概括与点评,而且也对文章的结…

c++视觉处理----图像模板匹配

模板匹配matchTemplate() matchTemplate() 是OpenCV中用于模板匹配的函数之一。它的主要作用是在一幅图像中搜索模板图像的位置,即找到模板在图像中的匹配位置。 函数原型如下: void cv::matchTemplate(InputArray image,InputArray templ,OutputArra…

生物信息学研究方向

一、生信的两个大类研究方向: 目录 一、生信的两个大类研究方向: 前者偏理论,后者偏向证明 第一类研究方向: 第二类研究方向: 二、具体的研究方向 1、序列分析 2、计算进化生物学 3、生物多样性的度量 4、蛋…

云原生与服务网格

云原生与服务网格 目录 文章来源 【优点知识】 istio课程大纲: https://youdianzhishi.com/web/course/1047 1、云原生技术范畴解读 什么是云原生 2大架构特征:不可变基础设施,声明式API CNCF 云原生整体视图 provisioning 供应 compli…