注:本篇仅用以记录本人日常学习内容
实现获取像素点的功能主要基于OpenCV的内置函数cv2.setMouseCallback(),即鼠标事件回调
setMouseCallback(winname, onMouse,userdata=0)
winname: 接收鼠标事件的窗口名称
onMouse: 处理鼠标事件的回调函数指针
userdata: 传给回调函数的用户数据
我们来看看可以处理的鼠标事件有哪些:
事件宏定义 | 触发鼠标事件的操作 |
---|---|
EVENT_MOUSEMOVE | 鼠标在窗口上移动 |
EVENT_LBUTTONDOWN | 鼠标左键单击 |
EVENT_RBUTTONDOWN | 鼠标右键单击 |
EVENT_MBUTTONDOWN | 鼠标中键单击 |
EVENT_LBUTTONUP | 释放鼠标左键 |
EVENT_RBUTTONUP | 释放鼠标右键 |
EVENT_MBUTTONUP | 释放鼠标中键 |
EVENT_LBUTTONDBLCLK | 鼠标左键双击 |
EVENT_RBUTTONDBLCLK | 鼠标右键双击 |
EVENT_MBUTTONDBLCLK | 鼠标中键双击 |
EVENT_MOUSEWHEEL | 鼠标滚轮向前或向后滚动 |
EVENT_MOUSEHWHEEL | 鼠标水平滚轮向前或向后滚动 |
代码实现:鼠标点击图片时,读取当前鼠标对应位置的像素值(顺序为BGR),在鼠标所在位置的左上角显示当前坐标值和像素值;鼠标移动时,旧的文本框消失
import cv2
import numpy as np
img = cv2.imread('E:/pypy/lenna.bmp')#读取图片
font_face,font_scale,thickness=cv2.FONT_HERSHEY_SIMPLEX,0.5,1
#鼠标交互
def mouseHandler(event,x,y,flags,param):
points = (x,y)
global imgCopy
#鼠标左键双击事件
if event == cv2.EVENT_LBUTTONDBLCLK:
#输出坐标
print(x,y)
#拷贝一张与原图像格式相同的新图像
imgCopy = img.copy()
#拼接文字
text = '['+str(x)+','+str(y)+']'+str(img[x,y])
#读取文字(宽,高),下基线
(t_w,t_h),baseLine = cv2.getTextSize(text,font_face,font_scale,thickness)
#在鼠标当前位置的左上角显示文字
cv2.putText(imgCopy,text,(x-t_w,y),font_face,font_scale,(125,125,125))
cv2.imshow('win',imgCopy)
#鼠标移动事件
elif event == cv2.EVENT_MOUSEMOVE:
#显示原图片能使文本框消失
cv2.imshow('win',img)
cv2.namedWindow('win')
#窗口与回调函数绑定
cv2.setMouseCallback('win',mouseHandler)
cv2.imshow('win',img)
cv2.waitKey()