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

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

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是不支持绘制完某一个图形后进行删除 *** 作的,有心的小伙伴可以试一下,完成后欢迎交流!

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/942636.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-18
下一篇 2022-05-18

发表评论

登录后才能评论

评论列表(0条)

保存