• Opencv(图像处理)-基于Python-绘图功能


    在这里插入图片描述

    1.介绍

    OpenCV为开发者还提供了绘图功能,我们可以通过函数来实现在图片上作图。

    2. line()

    画线
    cv2.line(img,开始点,结束点,颜色,线宽,线型,shift)
    参数:img:在选中的图片上画;
    开始点/结束点:开始坐标和结束坐标(x,y);
    颜色:(b,g,r),作为元组输入,如果是灰度图像,直接填数字。
    线宽:线或圆等的粗细。如果对闭合图形(如圆)传递-1 ,它将填充形状。默认厚度= 1
    线型:线的类型,是否为8连接线,抗锯齿线等。默认情况下,为8连接线。cv.LINE_AA给出了抗锯齿的线条,看起来非常适合曲线

    3.rectangle()

    画矩形
    cv2.rectangle(img,起始坐标,中止坐标,颜色,线宽,线型)
    img:在选中的图片上画;
    起始坐标,中止坐标:从左上角坐标开始,到右下角结束。
    颜色:(b,g,r),作为元组输入,如果是灰度图像,直接填数字。
    线宽:线或圆等的粗细。如果对闭合图形(如圆)传递-1 ,它将填充形状。默认厚度= 1
    线型:线的类型,是否为8连接线,抗锯齿线等。默认情况下,为8连接线。cv.LINE_AA给出了抗锯齿的线条,看起来非常适合曲线。

    4.circle()

    画圆
    cv2.circle(img,中心坐标,半径,颜色,线宽,线型)
    img:在选中的图片上画;
    中心坐标和半径:圆的中心坐标,半径。
    颜色:(b,g,r),作为元组输入,如果是灰度图像,直接填数字。
    线宽:线或圆等的粗细。如果对闭合图形(如圆)传递-1 ,它将填充形状。默认厚度= 1
    线型:线的类型,是否为8连接线,抗锯齿线等。默认情况下,为8连接线。cv.LINE_AA给出了抗锯齿的线条,看起来非常适合曲线。

    5. ellipse()

    画椭圆
    cv2.ellipse(img,中心位置,(长轴长,短轴长),angle,stratAngle,endAngle,颜色,线宽,线型)
    img:在选中的图片上画;
    中心位置:中心坐标
    (长轴长,短轴长):元组的形式输入轴的长度。
    angle:椭圆沿顺时针方向旋转的角度。
    startAngle和endAngle:从主轴沿顺时针方向测量的椭圆弧的开始和结束。即给出0和360给出完整的椭圆。

    6.polylines()

    画多边形
    cv2.polylines(img,点集,是否闭环,颜色)
    img:在选中的图片上画;
    点集:点的集合,如:[[10,5],[20,30],[70,20],[50,10]],并且点集的数据格式必须为np.int32
    是否闭环:True\false
    颜色:(b,g,r),作为元组输入,如果是灰度图像,直接填数字

    7.fillPoly()

    画实心的多边形
    cv2.fillPoly(img,点集,颜色)

    8. putText()

    将文本放入图像中
    cv2.putText(img,放入文字,起始坐标,font,字体大小,颜色,线宽,线型)
    img:在选中的图片上画
    放入文字:是一个字符串
    起始坐标:放入位置的左下角坐标
    font:文字类型,什么字体
    字体大小:填数字
    颜色:(b,g,r),作为元组输入,如果是灰度图像,直接填数字。
    线宽:线或圆等的粗细。如果对闭合图形(如圆)传递-1 ,它将填充形状。默认厚度= 1
    线型:线的类型,是否为8连接线,抗锯齿线等。默认情况下,为8连接线。cv2.LINE_AA给出了抗锯齿的线条,看起来非常适合曲线,也适合文字。

    字体的标志:
    在这里插入图片描述

    代码示例

    import cv2
    import numpy as np
    
    # 创建一个黑色图片
    img = np.zeros((480, 640, 3), np.uint8)
    # 画直线
    cv2.line(img, (10, 10), (300, 300), (255, 255, 255))
    
    # 画一个矩形,填上-1,是画实心矩形
    cv2.rectangle(img, (10, 10), (100, 40),(255, 255, 0), -1)
    
    # 画一个实心圆
    cv2.circle(img, (200, 200), 60, (0, 255, 255), -1, cv2.LINE_AA)
    
    # 画一个椭圆
    cv2.ellipse(img, (300, 200), (50, 20), 30, 0, 180, (255, 255, 255), -1)
    
    # 画一个多边形
    # 列表的形式创建一个数组
    # 将数组以列表的形式传进去
    arr = np.array([[100, 100], [100, 200], [300, 20], [400, 100]], np.int32)
    arr.reshape((-1, 1, 2))
    cv2.polylines(img, [arr], False, (255, 255, 255))
    
    # 填充多边形
    cv2.fillPoly(img, [arr], (255, 0, 255))
    
    
    # 加入字体
    cv2.putText(img, "OpenCV", (50, 350), cv2.FONT_HERSHEY_SIMPLEX, 3, (255, 255, 255),lineType = cv2.LINE_AA)
    
    
    cv2.imshow('draw', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    
    • 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

    在这里插入图片描述

    9.用鼠标在图片上作图

    """
    用鼠标在图片上直接作图
    按住键盘L,拖动鼠标画直线
    按住键盘r,拖动鼠标画矩形
    按住键盘c,拖动鼠标画圆
    """
    import cv2
    import numpy as np
    
    curshape = 0
    startpos = [0, 0]
    
    def mouse_callback(event, x, y, flags,userdata):
        global startpos, curshape
        if cv2.EVENT_LBUTTONDOWN == event: # 鼠标左键按下,获取起始坐标
            startpos = [x, y]
        elif event == cv2.EVENT_LBUTTONUP: # 鼠标左键抬起, 获得终点坐标
            if curshape == 0: # drawline
                cv2.line(img, startpos, (x, y), (255, 255, 255))
            elif curshape == 1: # drawrectangle
                cv2.rectangle(img, startpos, (x, y), (255, 255, 255))
            elif curshape == 2: # drawcircle
                a = (x - startpos[0])
                b = (y - startpos[1])
                r = int(((a**2)+(b**2))**0.5)  #结果要强转一下
                cv2.circle(img, startpos, r, (255, 255, 255))
    
    # 创建窗口大小
    cv2.namedWindow('drawing', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('drawing', 640, 480)
    
    # 让该函数一直监听drawing界面,为了调用函数
    cv2.setMouseCallback('drawing', mouse_callback)
    
    # 创建全黑图片
    img = np.zeros((480, 640, 3), np.uint8)
    
    while True:
        cv2.imshow('drawing', img)
        key = cv2.waitKey(0)&0xff
        if key == ord('q'):
            print("退出成功")
            break
        elif key == ord('l'): # 线
            curshape = 0
        elif key == ord('r'): # 矩形
            curshape = 1
        elif key == ord('c'): # 圆
            curshape = 2
        else:
            print("输入错误,请重新输入")
    
    
    cv2.destroyAllWindows()
    
    
    • 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

    在这里插入图片描述

    鼠标的回调函数,一定要传五个参数!第五个参数可以随便用一个参数来占位!

  • 相关阅读:
    Android学习笔记 83. 卡片和颜色
    Java版本电子招标采购系统源码:营造全面规范安全的电子招投标环境,促进招投标市场健康可持续发展
    数据的内存分布笔记总结
    Java中RPC框架及常用序列化协议
    Is BCP able to connect db with semicolon(or special charactors) in the password
    TensorRT--学习笔记
    OpenResty使用漏桶算法实现限流
    Linux学习记录——사 权限与工具
    IO多路复用
    如何让项目开发提速?
  • 原文地址:https://blog.csdn.net/weixin_45153969/article/details/130866961