使用 OpenCV 的 cv2.setMouseCallback()
方法来捕捉鼠标事件,并实现以下功能:
- 实时在鼠标指针附近显示其位置的像素坐标。
- 通过左键双击,将像素坐标记录到数组中。
- 通过右键点击,取消上一次添加的坐标。
下面是实现代码的示例:
import cv2
import numpy as np
import os
# 初始化一个数组,用于存储点击的坐标
coords = []
mouse_x, mouse_y = 0, 0 # 实时更新鼠标坐标的全局变量
# 鼠标回调函数
def mouse_callback(event, x, y, flags, param):
global mouse_x, mouse_y, coords
# 实时更新鼠标坐标
mouse_x, mouse_y = x, y
# 左键双击,记录坐标
if event == cv2.EVENT_LBUTTONDBLCLK:
coords.append([len(coords)+1, x, y])
print(f"记录坐标: {x}, {y}")
# 右键单击,取消上一次记录的坐标
elif event == cv2.EVENT_RBUTTONDOWN:
if coords:
removed_coord = coords.pop()
print(f"取消坐标: {removed_coord}")
# cv2.circle(img, (x,y), 3, (0,0,255), 2)
# 创建窗口并绑定鼠标回调函数
cv2.namedWindow("Image")
cv2.setMouseCallback("Image", mouse_callback)
# 读取图像
dir = './data/jpg/'
img_name = 'image.jpg'
img_path = os.path.join(dir, img_name)
img = cv2.imread(img_path)
while True:
# 在图像上显示鼠标当前位置
img_copy = img.copy()
# 获取当前鼠标坐标
cv2.putText(img_copy, f"({mouse_x}, {mouse_y})", (mouse_x + 20, mouse_y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5,
(0, 255, 0), 1)
for i in range(len(coords)):
pt = coords[i][1:]
cv2.circle(img_copy, (pt[0], pt[1]), 3, (0, 0, 255), 2)
cv2.putText(img_copy, f"{i+1}", (pt[0] + 5, pt[1] + 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)
# 显示图像
cv2.imshow("Image", img_copy)
# 按 'q' 键退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 关闭所有窗口
cv2.destroyAllWindows();
# 输出最终记录的坐标
print("最终记录的坐标: ", coords)
cv2.imwrite(os.path.join('./data', img_name.split('.')[0] + '_uvs.png'), img_copy)
np.savetxt(os.path.join('./data', img_name.split('.')[0] + '_uvs.txt'), coords, fmt='%d %d %d')
代码说明:
-
鼠标回调函数
mouse_callback
:- 捕捉鼠标的事件,包括左键双击和右键点击。
- 左键双击事件
cv2.EVENT_LBUTTONDBLCLK
记录当前的鼠标位置。 - 右键点击事件
cv2.EVENT_RBUTTONDOWN
移除上一次添加的坐标。
-
cv2.getWindowImageRect()
:- 该函数用于获取窗口图像矩形的尺寸以及鼠标位置。你可以实时显示鼠标坐标。
-
实时显示鼠标坐标:
- 使用
cv2.putText()
在图像上显示鼠标当前位置。
- 使用
-
记录坐标:
- 双击左键时,鼠标位置将会被添加到
coords
数组中,右键点击则会移除最后一个记录的坐标。
- 双击左键时,鼠标位置将会被添加到
-
退出:
- 按
q
键退出显示循环,并打印最终的坐标。
- 按