OpenCV学习笔记(7):(1-6)绘制作业实战

OpenCV学习笔记(7):(1-6)绘制作业实战

实现功能:按下l键,进入绘制直线模式;按下r键,拖动鼠标可以绘制矩形;按下c键,拖动鼠标可以绘制圆形

重要的是逻辑!设置全局变量curshape判断要绘制什么图,和起始坐标startpos

1.在while死循环中不断获得curshape的值,如果按下对应按键,改变该值

2.将此值传入鼠标回调函数mouse_callback中,根据该值决定绘制不同图形,比如:curshape==1,则绘制矩形

import cv2
import numpy as np

# 实现功能:按下l键,进入绘制直线模式;按下r键,拖动鼠标可以绘制矩形;按下c键,拖动鼠标可以绘制圆形

# 这是一个全局标志,判断要画什么图
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 == 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), 3)
        elif curshape == 2:  # 画圆形
            r = int(((x - startpos[0]) ** 2 + (y - startpos[1]) ** 2) ** 0.5)  # 勾股定理获取半径
            cv2.circle(img, startpos, r, (0, 0, 255), 3)
        else:  # 暂不支持其他按键
            print('暂不支持绘制其他图形')


# 绘制窗口
cv2.namedWindow('drawshape', cv2.WINDOW_AUTOSIZE)
# 设置鼠标回调函数
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()

在这里插入图片描述
其实实现的时候,有一个小瑕疵,只能通过鼠标左键的按下与抬起确认最终绘制图形的样子,没办法实时看出来想绘制图形的大小,类似于没有交互功能。

当然可以通过不断获取鼠标的位置来显示当前待绘制图形大小,但是结果肯定是出现无数个同心圆或者矩形,形成类似填充的效果。
opencv是不支持绘制完某一个图形后进行删除操作的,有心的小伙伴可以试一下,完成后欢迎交流!

觉得有用的小伙伴点个赞加个关注支持一下吧!有错误或者不恰当的地方请指出!一起学习、进步!!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值