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

这篇具有很好参考价值的文章主要介绍了《数字图像处理-OpenCV/Python》连载(22)绘制直线与线段。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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


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

opencv 在图片上画45度角的直线,《数字图像处理-OpenCV》连载,opencv,python,图像处理,计算机视觉,人工智能


第 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)所示的绘制结果相互影响。

opencv 在图片上画45度角的直线,《数字图像处理-OpenCV》连载,opencv,python,图像处理,计算机视觉,人工智能
图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文章来源地址https://www.toymoban.com/news/detail-786366.html

到了这里,关于《数字图像处理-OpenCV/Python》连载(22)绘制直线与线段的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《数字图像处理-OpenCV/Python》连载(1)前言

    本书京东优惠购书链接:https://item.jd.com/14098452.html 写作背景 编写本书的初衷,源自作者学习数字图像处理的经历。 在创新实验班开设的专业创新教育课程中,我选择的是数字图像处理方向。老师向我推荐的教材是冈萨雷斯的《数字图像处理》。学习的开始阶段非常困难。教

    2024年02月11日
    浏览(65)
  • 《数字图像处理-OpenCV/Python》连载(44)图像的投影变换

    本书京东优惠购书链接:https://item.jd.com/14098452.html 本书CSDN独家连载专栏:https://blog.csdn.net/youcans/category_12418787.html 几何变换分为等距变换、相似变换、仿射变换和投影变换,是指对图像的位置、大小、形状和投影进行变换,将图像从原始平面投影到新的视平面。OpenCV图像的几

    2024年02月04日
    浏览(76)
  • 《数字图像处理-OpenCV/Python》连载(10)图像属性与数据类型

    本书京东优惠购书链接:https://item.jd.com/14098452.html 本书CSDN独家连载专栏:https://blog.csdn.net/youcans/category_12418787.html 在Python语言中,OpenCV以Numpy数组存储图像,对图像的访问和处理都是通过Numpy数组的操作来实现的。 本章内容概要 介绍Python语言中OpenCV的数据结构,学习获取图像

    2024年02月07日
    浏览(88)
  • 《数字图像处理-OpenCV/Python》连载(4)图像的读取与保存

    本书京东优惠购书链接:https://item.jd.com/14098452.html 本书CSDN独家连载专栏:https://blog.csdn.net/youcans/category_12418787.html 为了方便初学者从零开始学习OpenCV-Python,本书从图像的读取、保存和显示等基本操作开始介绍,使读者可以循序渐进地使用和理解本书的每一个例程。 本章内容

    2024年02月09日
    浏览(64)
  • 《数字图像处理-OpenCV/Python》连载:空间滤波之高斯滤波器

    本书京东 优惠购书链接 https://item.jd.com/14098452.html 本书CSDN 独家连载专栏 https://blog.csdn.net/youcans/category_12418787.html 图像滤波是指在尽可能保留图像细节特征的条件下对目标图像的噪声进行抑制,是常用的图像处理方法。 空间滤波也称空间域滤波,滤波器规定了邻域形状与邻域

    2024年02月02日
    浏览(60)
  • 【Python_Opencv图像处理框架】信用卡数字识别项目

    本篇文章是opencv学习的第六篇文章,前面主要讲解了对图像的一些基本操作,这篇文章我们就开始大展身手,将前面所学的基础操作活学活用。既能复习基础操作,又能学到一些新的知识。作为初学者,我尽己所能,但仍会存在疏漏的地方,希望各位看官不吝指正🥰 我们通

    2024年02月03日
    浏览(55)
  • 数字图像处理二维码识别python+opencv实现二维码实时识别

    数字图像处理二维码识别 python+opencv实现二维码实时识别 特点: (1)可以实现普通二维码,条形码; (2)解决了opencv输出中文乱码的问题 (3)增加网页自动跳转功能 (4)实现二维码实时检测和识别 代码保证原创、无错误、能正常运行(如果电脑环境配置没问题) 送二维

    2024年01月16日
    浏览(69)
  • 数字图像处理(实践篇)二十七 Python-OpenCV 滑动条的使用

    目录 1 涉及的函数 2 实践 1 涉及的函数 ⒈ setWindowProperty()用于设置GUI应用程序的属性 参数 : ① 

    2024年01月25日
    浏览(66)
  • 数字图像处理(实践篇)二十九 OpenCV-Python在图像中检测矩形、正方形和三角形的实践

    目录 1 方案 2 实践 1 方案 ①检测矩形和正方形 ⒈检测图像中的所有轮廓。 ⒉循环检查所有检测到的轮廓。 ⒊为每个轮廓找到近似的轮廓。如果近似轮廓中的顶点数为4,则计算 宽高比 用来区分 矩形 和 正方形 。如果宽高比在0.9到1.1之间,则认为为正方形,否则的话,则为

    2024年01月25日
    浏览(61)
  • OpenCV数字图像处理基于C++:图像分割

    图像阈值化分割是一种常用的、传统的图像分割技术,因其 实现简单、计算量小、性能比较稳定 而成为图像分割中基本和应用广泛的分割技术。特别 适合于目标和背景占据不同灰度级范围的图像 。不仅 可以极大地压缩数据量 ,而且大大 简化了分析和处理的步骤 ,是进行

    2024年02月11日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包