说明:由于平常使用中有使用鼠标点击选点的要求,本文在原教程的基础上增加了鼠标相关操作。
原代码
def on_mouse(event, x, y, flags, param):
print("event=",event,"x=",x,",y=",y)
def key_mouse_demo():
image = cv.imread('images/test.png')
if image is None:
print("Error: Image not found or failed to load.")
return
cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
cv.imshow("input", image)
cv.setMouseCallback("input",on_mouse,None)
while True:
c = cv.waitKey(1)
if c == 48:
cv.imshow('input', image)
if c == 49:
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
cv.imshow('input', gray)
if c == 50:
hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)
cv.imshow('input', hsv)
if c == 27:
break
cv.destroyAllWindows()
预期效果
- 鼠标操作:
- 鼠标左键:打印点击坐标。
- 鼠标右键:打印点击坐标。
- 鼠标移动:实时打印鼠标位置。
- 键盘操作:
- 按
0
:显示原始图像。 - 按
1
:显示灰度图像。 - 按
2
:显示 HSV 图像。 - 按
ESC
:退出程序。
- 按
程序运行流程:
- 打开窗口并显示图像。
- 根据用户操作实时响应鼠标事件或键盘按键。
- 按
ESC
键退出程序。
代码优化
import cv2 as cv
# 定义鼠标事件回调函数
def on_mouse(event, x, y, flags, param):
"""
鼠标事件回调函数
"""
if event == cv.EVENT_LBUTTONDOWN:
print(f"Left button clicked at ({x}, {y})")
elif event == cv.EVENT_RBUTTONDOWN:
print(f"Right button clicked at ({x}, {y})")
elif event == cv.EVENT_MOUSEMOVE:
print(f"Mouse moved to ({x}, {y})")
# 定义键盘与鼠标交互函数
def key_mouse_demo():
"""
键盘与鼠标交互演示
"""
# 读取图像
image = cv.imread('images/test.png')
if image is None:
print("Error: Image not found or failed to load.")
return
# 创建窗口并显示图像
cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
cv.imshow("input", image)
# 设置鼠标回调函数
cv.setMouseCallback("input", on_mouse)
print("Press keys to interact: 0=original, 1=grayscale, 2=HSV, ESC=exit")
while True:
c = cv.waitKey(1)
# 按键 0:显示原始图像
if c == ord('0'):
cv.imshow("input", image)
print("Displaying original image")
# 按键 1:显示灰度图像
elif c == ord('1'):
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
cv.imshow("input", gray)
print("Displaying grayscale image")
# 按键 2:显示 HSV 图像
elif c == ord('2'):
hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)
cv.imshow("input", hsv)
print("Displaying HSV image")
# 按 ESC 键退出
elif c == 27: # ESC 键的 ASCII 值
print("Exiting...")
break
# 释放所有窗口
cv.destroyAllWindows()
# 调用函数
key_mouse_demo()
代码详解
1. 鼠标事件回调函数
def on_mouse(event, x, y, flags, param):
"""
event: 鼠标事件类型(如左键按下、右键按下、移动等)。
x, y: 鼠标事件发生时的坐标(图像坐标系)。
flags: 事件触发时的附加标志(如 Ctrl、Shift 键是否按下)。
param: 传递的额外参数。
"""
if event == cv.EVENT_LBUTTONDOWN:
print(f"Left button clicked at ({x}, {y})") # 左键点击
elif event == cv.EVENT_RBUTTONDOWN:
print(f"Right button clicked at ({x}, {y})") # 右键点击
elif event == cv.EVENT_MOUSEMOVE:
print(f"Mouse moved to ({x}, {y})") # 鼠标移动
功能:
- 通过
cv.setMouseCallback
注册此函数,可以实时捕获鼠标事件并打印其类型和位置。 - 示例中实现了左键点击、右键点击和鼠标移动的响应。
2. 键盘交互逻辑
while True:
c = cv.waitKey(1)
if c == ord('0'):
cv.imshow("input", image)
print("Displaying original image")
elif c == ord('1'):
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
cv.imshow("input", gray)
print("Displaying grayscale image")
elif c == ord('2'):
hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)
cv.imshow("input", hsv)
print("Displaying HSV image")
elif c == 27: # ESC 键
print("Exiting...")
break
按 ESC
:退出程序。
按键检测:
cv.waitKey(1)
:每 1 毫秒检测一次键盘事件,返回 ASCII 值。
例如,ord('0')
对应按键 0
,ord('1')
对应按键 1
。
功能映射:
按 0
:显示原始图像。
按 1
:将图像转换为灰度并显示。
按 2
:将图像转换为 HSV 并显示。
© 版权声明
转载请注明出处,并标明原文链接。
本网站尊重知识产权,如有侵权,请及时联系我们删除。
本站所有原创内容仅用于学习和交流目的,未经作者和本站授权不得进行商业使用或盈利行为。
本网站尊重知识产权,如有侵权,请及时联系我们删除。
本站所有原创内容仅用于学习和交流目的,未经作者和本站授权不得进行商业使用或盈利行为。
THE END
暂无评论内容