• Python机器视觉--OpenCV入门--OpenCV鼠标绘制图形


    1. 绘制图形

    1.1 API介绍

    利用OpenCV提供的绘制图形API可以轻松在图像上绘制各种图形, 比如直线, 矩形, 圆, 椭圆等图形.

    • line(img, pt1, pt2, color, thickness, lineType, shift) 画直线

      • img: 在哪个图像上画线
      • pt1, pt2: 开始点, 结束点. 指定线的开始与结束位置
      • color: 颜色
      • thickness: 线宽
      • lineType: 线型.线型为-1, 4, 8, 16, 默认为8
      • shift: 坐标缩放比例.
    • rectangle() 参数同上 画矩形

    • circle(img, center, radius, color[, thickness[, lineType[, shift]]]) 中括号内参数表示可选参数. 画圆

    • ellipse(img, 中心点, 长宽的一半, 角度, 从哪个角度开始, 从哪个角度结束,…)

    请添加图片描述

    • polylines(img, pts, isClosed, color[, thickness[, lineType[, shift]]]) 画多边形
    • fillPoly 填充多边形
    • putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]]) 绘制文本
      • text 要绘制的文本
      • org 文本在图片中的左下角坐标
      • fontFace 字体类型即字体
      • fontScale 字体大小

    1.2 代码实现

    import cv2
    import numpy as np
    
    img = np.zeros((480, 640, 3), np.uint8)
    # cv2.line(img, (10, 20), (300, 400), (0, 0, 255), 5, 4)
    # cv2.line(img, (80, 100), (380, 480), (0, 0, 255), 5, 16)
    
    # 画矩形
    # cv2.rectangle(img, (10,10), (100, 100), (0, 0, 255), -1)
    
    # 画圆
    # cv2.circle(img, (320, 240), 100, (0, 0, 255))
    # cv2.circle(img, (320, 240), 5, (0, 0, 255), -1)
    # 画椭圆
    # cv2.ellipse(img, (320, 240), (100, 50), 15, 0, 360, (0, 0, 255), -1)
    
    #画多边形
    # pts = np.array([(300, 10), (150, 100), (450, 100)], np.int32)
    # cv2.polylines(img, [pts], True, (0, 0, 255))
    
    #填充多边形
    # cv2.fillPoly(img, [pts], (255, 255, 0))
    cv2.putText(img, "Hello OpenCV!", (10, 400), cv2.FONT_HERSHEY_TRIPLEX, 3, (255,0,0))
    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

    绘制中文 opencv本身不支持, 因为没有中文字体.我们可以借助pillow来实现绘制中文

    # 安装pillow
    import cv2
    import numpy as np
    from PIL import ImageFont, ImageDraw, Image
    
    img = np.full((200, 200, 3), fill_value=255, dtype=np.uint8)
    # 导入字体文件. 
    font_path = 'msyhbd.ttc'
    font = ImageFont.truetype(font_path, 15)
    img_pil = Image.fromarray(img)
    draw = ImageDraw.Draw(img_pil)
    draw.text((10, 150), '绘制中文', font=font, fill=(0, 255, 0, 0))
    img = np.array(img_pil)
    
    # 中文会显示问号
    cv2.putText(img, '中文', (10, 100), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 1)
    
    cv2.imshow('img', 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

    小惊喜:基于OpenCV实现按l键之后拖动鼠标绘制直线, 按r键之后拖动鼠标绘制矩形, 按r键拖动鼠标绘制圆形

    # 按下l, 拖动鼠标, 可以绘制直线.
    # 按下r, 拖到鼠标, 可以绘制矩形
    # 按下c, 拖动鼠标, 可以绘制圆. 拖动的长度可以作为半径.
    import cv2
    import numpy as np
    
    # 这是一个全局标志, 判断要画什么类型的图.
    curshape = 0
    startpos = (0, 0)
    
    # 创建背景图
    img = np.zeros((480, 640, 3), np.uint8)
    
    # 要监听鼠标的行为, 所以必须通过鼠标回调函数实现.
    def mouse_callback(event, x, y, flags, userdata):
        # 引入全局变量
        global curshape, startpos
        # 引入非本层的局部变量用什么关键字nonlocal
        if event == cv2.EVENT_LBUTTONDOWN:
            # 记录起始位置
            startpos = (x, y)
            
        elif event ==0 and flags == 1: # 表示按下鼠标左键并移动鼠标
            if curshape == 0: # 画直线
                cv2.line(img, startpos, (x, y), (0, 0, 255), 1)
            elif curshape == 1: # 画矩形
                cv2.rectangle(img, startpos, (x, y), (0, 0, 255), 1)
            elif curshape == 2: # 画圆
                # 注意计算半径
                a = (x - startpos[0])
                b = (y - startpos[1])
                r = int((a ** 2 + b ** 2) ** 0.5)
                # 画圆的时候, 半径必须是整数
                cv2.circle(img, startpos, r, (0, 0, 255), 1)
            else: # 按其他的按键
                print('暂不支持绘制其他图形')
                
        elif event == cv2.EVENT_LBUTTONUP:
            # 判断要画什么类型的图.
            if curshape == 0: # 画直线
                cv2.line(img, startpos, (x, y), (0, 0, 255), 3)
            elif curshape == 1: # 画矩形
                cv2.rectangle(img, startpos, (x, y), (0, 0, 255), 1)
            elif curshape == 2: # 画圆
                # 注意计算半径
                a = (x - startpos[0])
                b = (y - startpos[1])
                r = int((a ** 2 + b ** 2) ** 0.5)
                # 画圆的时候, 半径必须是整数
                cv2.circle(img, startpos, r, (0, 0, 255), 1)
            else: # 按其他的按键
                print('暂不支持绘制其他图形')
                
                
    # 创建窗口
    cv2.namedWindow('drawshape', cv2.WINDOW_NORMAL)
    # 设置鼠标回调函数
    cv2.setMouseCallback('drawshape', mouse_callback)
    
    while True:
        cv2.imshow('drawshape', img)
        # 检测按键
        key = cv2.waitKey(1)
        if key == ord('q'):
            break
        elif key == ord('l'):
            curshape = 0
        elif key == ord('r'):
            curshape = 1
        elif key == ord('c'):
            curshape = 2
            
    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
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    效果如图所示

    在这里插入图片描述

  • 相关阅读:
    vue 模板、组件
    进入数字化供应链高潮期,与IBM咨询共创无边界竞争力
    融合与创新:数据堂骨龄标注工具为医生赋能
    DOPE-FITC在细胞定位、动态追踪等方面的应用-星戈瑞
    RAPTOR 一种基于树的RAG方法,RAG的准确率提高 20%
    信息学奥赛一本通:1410:最大质因子序列
    TRC肿瘤学丨艾美捷TRC癌症代谢研究领域
    【Redis高可用】
    本地部署FastGPT使用在线大语言模型
    Hexo安装配置
  • 原文地址:https://blog.csdn.net/qq_43944517/article/details/126322554