CV4 基于鼠标回调函数及轨迹调色的简单人机交互应用

简介: 创建鼠标回调函数具有特定的格式,该格式在所有地方都相同。它仅在功能上有所不同。

问:使用轨迹栏创建颜色和画笔半径可调的Paint应用程序?


一 鼠标回调函数


创建鼠标回调函数具有特定的格式,该格式在所有地方都相同。它仅在功能上有所不同。


因此,下列这段代码我们的鼠标回调函数可以做一件事——在我们双击的地方绘制一个圆圈


import cv2
import numpy as np
#定义一个鼠标回调函数,想要知道更多的鼠标事件,可通过以下屏蔽的代码实现
# import cv2 as cv
# events = [i for i in dir(cv) if 'EVENT' in i]
# print( events )
#定义一个鼠标回调函数的处理事件
def draw_circle(event,x,y,flags,param):
    if event == cv2.EVENT_LBUTTONDBLCLK:
        cv2.circle(img,(x,y),100,(0,0,255),-1)
img = np.zeros((512,512,3),np.uint8)
cv2.namedWindow('img')
# 鼠标事件检查,输入参数为:1.图片名,2.已定义的鼠标事件
cv2.setMouseCallback('img',draw_circle)
while(1):
    cv2.imshow('img',img)
    if cv2.waitKey(20) & 0xFF == 27:
        break
cv2.destroyAllWindows()


  • cv2.setMouseCallback函数


功能:鼠标事件检查


输入参数为:1.图片名,2.已定义的鼠标事件


下列是一些常见的鼠标事件


事件名 鼠标活动
EVENT_MOUSEMOVE 鼠标移动
EVENT_LBUTTONDOWN 左键点击
EVENT_RBUTTONDOWN 右键点击
EVENT_MBUTTONDOWN 中键点击
EVENT_LBUTTONUP 左键放开
EVENT_RBUTTONUP 右键放开
EVENT_MBUTTONUP 中键放开
EVENT_LBUTTONDBLCLK 左键双击
EVENT_RBUTTONDBLCLK 右键双击
EVENT_MBUTTONDBLCLK 中键双击


接下来,我们要进行更高级的操作——通过拖动鼠标来绘制矩形或圆形(取决于我们选择的模式)


import cv2
import numpy as np
drawing = False
mode = True
ix,iy=-1,-1
#多条件鼠标判断函数
def draw_circle(event,x,y,flags,param):
    global ix,iy,drawing,mode
    if event == cv2.EVENT_LBUTTONDOWN:
        drawing = True
        ix,iy = x,y
    elif event == cv2.EVENT_MOUSEMOVE:
        if drawing == True:
            if mode == True:
                cv2.rectangle(img,(ix,iy),(x,y),(0,0,0),5)
            else:
                cv2.circle(img,(x,y),5,(0,0,255),-1)
    elif event == cv2.EVENT_LBUTTONUP:
        drawing = False
        if mode == True:
            cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),5)
        else:
            cv2.circle(img,(x,y),5,(0,0,255),-1)
img = np.zeros((720,1280,3),np.uint8)
cv2.namedWindow('img')
# 鼠标事件检查,输入参数为:1.图片名,2.已定义的鼠标事件
cv2.setMouseCallback('img',draw_circle)
while(1):
    cv2.imshow('img',img)
    if cv2.waitKey(50) & 0xFF == ord('m'):
        mode=~mode
    if cv2.waitKey(20) & 0xFF == 27:
        break
cv2.destroyAllWindows()


  • global是python里定义一个全局变量的意思
  • ix,iy=-1,-1是填充图形的意思
  • python里的取反操作为:mode=~mode


本质上,也是在我们def的函数那里,多加了几个条件判断而已


如果你的opencv-python的版本为4.5.x,那么你会出现以下报错:


error: (-27:Null pointer) NULL window: 'TrackBars' in function 'cvGetTrackbarPos'


想要消掉这个报错,我们需要把opencv-python的版本降到4.1.x


具体可以参考这篇博客


How can I fix get trackbar position error in pycharm?


二 轨迹栏作为调色板


我们将创建一个简单的应用程序,以显示您指定的颜色。您有一个显示颜色的窗口,


以及三个用于指定B、G、R颜色的跟踪栏。滑动轨迹栏,并相应地更改窗口颜色。


默认情况下,初始颜色将设置为黑色


import numpy as np
import cv2
def nothing(x):
    pass
image = np.zeros((300,512,3),np.uint8)
cv2.namedWindow('image')
cv2.createTrackbar('R','image',0,255,nothing)
cv2.createTrackbar('G','image',0,255,nothing)
cv2.createTrackbar('B','image',0,255,nothing)
switch = '0:OFF \n 1:ON'
cv2.createTrackbar(switch,'image',0,1,nothing)
while(1):
    cv2.imshow('image',image)
    if cv2.waitKey(20)&0xFF == ord('q'):
        break
    r = cv2.getTrackbarPos('R','image')
    g = cv2.getTrackbarPos('G','image')
    b = cv2.getTrackbarPos('B','image')
    s = cv2.getTrackbarPos(switch,'image')
    if s == 0:
        image[:] = 0
    else:
        image[:] = [b,g,r]
cv2.destroyAllWindows()


cv2.namedWindow(‘image’)命名的image窗口名,即是下面各个函数的**‘要显示的窗口名’**,不可改变


  • cv2.createTrackbar函数


功能:创造一个在图片上可见的轨道,可供用户调控


输入参数:1.名称 2.要显示的窗口名(你必须优先定义,且名字必须相同)


3.最小值 4.最大值 5.事件函数(这里是nothing,即不做什么)


  • cv2.getTrackbarPos函数


功能:实时获取用户改变的数据


输入参数:1.轨道名 2.窗口名


三 使用轨迹栏创建颜色和画笔半径可调的Paint应用程序


import numpy as np
import cv2
ix,iy=-1,-1
drawing=False
#多条件鼠标判断函数
def draw_circle(event,x,y,flags,param):
    global ix,iy,drawing,mode,b,g,r
# drawing的作用是记录轨迹什么时候开始,什么时候结束
    if event == cv2.EVENT_LBUTTONDOWN:
        drawing = True
        ix,iy = x,y
    elif event == cv2.EVENT_MOUSEMOVE:
        if drawing == True:
           cv2.circle(image,(x,y),size,(b,g,r),-1)
    elif event == cv2.EVENT_LBUTTONUP:
        drawing = False
        cv2.circle(image,(x,y),size,(b,g,r),-1)
# 为了配合cv2.createTrackbar函数使用
def nothing(x):
    pass
# 创建一个白色画布
image = np.zeros((300,512,3),np.uint8)+255
cv2.namedWindow('image')
# 创建轨道,分别是R,G,B,画笔大小
cv2.createTrackbar('R','image',0,255,nothing)
cv2.createTrackbar('G','image',0,255,nothing)
cv2.createTrackbar('B','image',0,255,nothing)
cv2.createTrackbar('SIZE','image',0,10,nothing)
# 鼠标事件检查,输入参数为:1.图片名,2.已定义的鼠标事件
cv2.setMouseCallback('image',draw_circle)
while(1):
    cv2.imshow('image',image)
    if cv2.waitKey(20)&0xFF == ord('q'):
        break
# 实时获取轨道的值
    r = cv2.getTrackbarPos('R', 'image')
    g = cv2.getTrackbarPos('G', 'image')
    b = cv2.getTrackbarPos('B', 'image')
    size = cv2.getTrackbarPos('SIZE','image')
cv2.destroyAllWindows()


size是画笔的大小,ix/iy是记录第一次按下的点的位置


四 效果图


94749f7dd94d525f9b7c2d2899d34e0d.png


R/G/B/Size均可调,满足题目要求~

相关文章
|
JSON Java API
LAZADA平台API文档示例
LAZADA平台API文档示例
|
机器学习/深度学习 人工智能 自然语言处理
多模态大一统、AI智能体将如何引领未来?阿里妈妈与人大高瓴学者探讨大模型趋势
多模态大一统、AI智能体将如何引领未来?阿里妈妈与人大高瓴学者探讨大模型趋势
473 0
|
Linux
【PyAutoGUI操作指南】05 屏幕截图与图像定位:截图+定位单个目标+定位全部目标+灰度匹配+像素匹配+获取屏幕截图中像素的RGB颜色
【PyAutoGUI操作指南】05 屏幕截图与图像定位:截图+定位单个目标+定位全部目标+灰度匹配+像素匹配+获取屏幕截图中像素的RGB颜色
1585 0
|
机器学习/深度学习 人工智能 自然语言处理
为什么要学习大模型?
本文深入探讨了大模型的学习意义、应用需求及训练方法,帮助读者理解其底层逻辑与潜力。通过类比PPT和Excel在职场中的重要性,强调掌握大模型技能对未来职业发展的关键作用。文章还分析了LLM微调的必要性及其在企业内外部场景的应用价值,如智能客服、游戏NPC等。此外,专栏专注于ChatGPT与通义千问的训练原理,提供系统化的学习路径,适合从零基础到进阶的不同人群。无论想提升工作效率还是从事相关工程开发,都能从中受益。内容收录于[Github](https://github.com/Java-Edge/Java-Interview-Tutorial),欢迎关注!
416 0
为什么要学习大模型?
|
10月前
|
SQL Oracle 关系型数据库
Oracle 从 DMP 文件中恢复指定表的步骤
Oracle 从 DMP 文件中恢复指定表的步骤
910 7
|
12月前
openpyxl打开表格警告|4-9
openpyxl打开表格警告|4-9
|
Prometheus 监控 Cloud Native
简单搭建基本Prometheus监控系统
简单搭建基本Prometheus监控系统
243 0
|
算法 应用服务中间件 图形学
贝叶斯推理导论:如何在‘任何试验之前绝对一无所知’的情况下计算概率
这篇文章探讨了贝叶斯推理的发展历史,从帕斯卡尔和费马的早期工作到托马斯·贝叶斯、皮埃尔-西蒙·拉普拉斯和哈罗德·杰弗里斯的贡献。文章指出,贝叶斯分析经历了从使用均匀先验到发展更为客观的方法,如杰弗里斯先验的过程。它讨论了费雪对逆概率的批评,以及贝叶斯方法在处理不确定性问题上的优势。文章还介绍了如何通过匹配覆盖率来评估先验分布的合理性,并通过几个例子展示了不同先验在二项分布和正态分布问题中的应用。最后,文章提出了贝叶斯分析在统计学中的地位,强调了在缺乏先验知识时建立良好先验的重要性,并讨论了主观性和客观性在统计推理中的角色。
256 1
|
算法 JavaScript 决策智能
基于禁忌搜索算法的TSP路径规划matlab仿真
**摘要:** 使用禁忌搜索算法解决旅行商问题(TSP),在MATLAB2022a中实现路径规划,显示优化曲线与路线图。TSP寻找最短城市访问路径,算法通过避免局部最优,利用禁忌列表不断调整顺序。关键步骤包括初始路径选择、邻域搜索、解评估、选择及禁忌列表更新。过程示意图展示搜索效果。

热门文章

最新文章