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


    《数字图像处理-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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65

    程序说明:
    (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

  • 相关阅读:
    k8s 自动扩缩容HPA原理及adapter配置详解
    vue+element el-input使用clearable后出现两个关闭图标
    金仓数据库KingbaseES客户端编程接口指南-ado.net(2. 概述)
    提升网站效率与SEO优化:ZBlog插件集成解决方案
    【7 同步原语】
    bizlog通用操作日志组件(使用篇)
    漫谈:C语言 C++ 左值、右值、类型转换
    你有在上传文件下载文件踩过坑吗?
    MySQL表查询--多表笛卡尔积和子连接
    【通信】基于Matlab实现延时波束形成附完整代码
  • 原文地址:https://blog.csdn.net/youcans/article/details/133813146