OpenCV学习笔记 - task06

这篇博客介绍了如何利用OpenCV库通过鼠标交互来绘制图形,包括线条、矩形和圆形。用户按下'l'键可画线,'r'键画矩形,'c'键画圆。提供了完整的Python代码示例,并宣布作者接下来将专注于深度学习,特别是TensorFlow框架的相关应用。
摘要由CSDN通过智能技术生成

第五章: OpenCV图形绘制综合实战-实现鼠标绘制基本图形

需要实现的效果:

通过鼠标拖拽实现图形的绘制,

可以画线, 当用户按下l键, 即选择了画线, 此时, 滑动鼠标即可画线;
可以画矩形, 当用户按下r键, 即选择了画矩形, 此时, 滑动鼠标即可画矩形;
可以画圆, 当用户按下c键, 即选择了画圆, 此时, 滑动鼠标即可画圆.

实战代码:

'''
要实现的基本功能: 
可以画线, 当用户按下l键, 即选择了画线, 此时, 滑动鼠标即可画线; 
可以画矩形, 当用户按下r键, 即选择了画矩形, 此时, 滑动鼠标即可画矩形; 
可以画圆, 当用户按下c键, 即选择了画圆, 此时, 滑动鼠标即可画圆. 
author: paul
'''
import cv2 
import numpy as np 
import pandas as pd 


'''
param curshape: 
0 - draw line 
1 - draw rectangle 
2 - draw circle 
'''
curshape = 0 
startpos = (0, 0)
img = np.zeros((480, 640, 3), np.uint8)


# 鼠标回调函数
def mouse_callback(event, x, y, flags, userdata):
    # print(event, x, y, flags, userdata)
    # event: 事件 
    '''
    根据鼠标落下的事件获取起始点, 根据鼠标抬起的事件获取终止点. 
    '''
    global curshape, startpos 
    
    if (event & cv2.EVENT_LBUTTONDOWN == cv2.EVENT_LBUTTONDOWN): 
        startpos = (x, y) 
    elif (event & cv2.EVENT_LBUTTONUP == cv2.EVENT_LBUTTONUP): 
        if curshape == 0: 
            cv2.line(img, startpos, (x, y), (0,0,255))
        elif curshape == 1: 
            cv2.rectangle(img, startpos, (x, y), (0, 0, 255))
        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))
        else: 
            print('error: no shape')


# 创建窗口
cv2.namedWindow('draw_shape', cv2.WINDOW_NORMAL)

# 设置鼠标回调
cv2.setMouseCallback('draw_shape', mouse_callback)

# 显示窗口和背景
while True: 
    cv2.imshow('draw_shape', img) 
    key = cv2.waitKey(1) & 0xFF 
    if key == ord('q'): 
        break 
    elif key == ord('l'):  # line
        curshape = 0 
    elif key == ord('r'):  # rectangle 
        curshape = 1 
    elif key == ord('c'): # circle 
        curshape = 2 


    

cv2.destroyAllWindows() 

小通知:

关于OpenCV的内容先更新到这里, 后续自己的重点会放在深度学习上, 尤其是基于tensorflow框架的一些网络模型的相关实现和应用.

最后祝大家元旦快乐, 2023年事事顺遂~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

统计小白er

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值