python opencv 显示多窗口图像并获取点击处像素点坐标

本文最后更新于:2021年12月11日 上午

本文介绍使用python 的 opencv 库显示多个图片窗口,并获取点击点像素位置的方法。

opencv 显示图像

显示图像主要通过namedWindow方法定义窗口,和imshow方法刷新窗口内容实现的,需要停止时按Esc键退出并销毁窗口:

1
2
3
4
5
6
7
image = np.zeros((512,512,3), np.uint8)
cv2.namedWindow('image')
while(True):
cv2.imshow('image', image)
if cv2.waitKey(20) & 0xFF == 27:
break
cv2.destroyAllWindows()

显示多幅图像就使用不同的窗口名称建立窗口即可:

1
2
3
4
5
6
7
8
9
10
image_1 = np.zeros((512,512,3), np.uint8)
cv2.namedWindow('image_1')
image_2 = np.zeros((512,512,3), np.uint8)
cv2.namedWindow('image_1')
while(True):
cv2.imshow('image_1', image_1)
cv2.imshow('image_2', image_2)
if cv2.waitKey(20) & 0xFF == 27:
break
cv2.destroyAllWindows()

获取鼠标单击事件信息

本质上是cv库中的事件绑定、触发、捕获信息的流程,就用简单的示例抛砖引玉了。

  • 定义事件函数:
1
2
3
def get_point(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDOWN:
print('clicking: ', x, y)
  • 绑定事件:
1
cv2.setMouseCallback('image_1', get_point, param)

可以向事件中传入参数,放在param位置。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import cv2
import numpy as np


def get_point(event, x, y, flags, param):
# 鼠标单击事件
if event == cv2.EVENT_LBUTTONDOWN:
# 输出坐标
print('clicking: ', x, y)
# 在传入参数图像上画出该点
cv2.circle(param, (x, y), 1, (255, 255, 255), thickness=-1)


if __name__ == "__main__":
# 定义两幅图像
image_1 = np.zeros((200, 200, 3), dtype='uint8')
image_2 = np.zeros((200, 200, 3), dtype='uint8')

# 定义两个窗口 并绑定事件 传入各自对应的参数
cv2.namedWindow('image_1')
cv2.setMouseCallback('image_1', get_point, image_1)

cv2.namedWindow('image_2')
cv2.setMouseCallback('image_2', get_point, image_2)

# 显示图像
while(True):
cv2.imshow('image_1', image_1)
cv2.imshow('image_2', image_2)
if cv2.waitKey(20) & 0xFF == 27:
break

# 销毁窗口
cv2.destroyAllWindows()

源码

https://github.com/zywvvd/Python_Practise

参考资料