目标
https://blog.youkuaiyun.com/qton_csdn/article/details/70193884
• 学习使用 OpenCV 处理鼠标事件• 你将要学习的函数是:cv2.setMouseCallback()
鼠标事件 :cv2.setMouseCallback()
cv2_EVENT_MOUSEMOVE 0 滑动
cv2_EVENT_LBUTTONDOWN 1 左键点击
cv2_EVENT_RBUTTONDOWN 2 右键点击
cv2_EVENT_MBUTTONDOWN 3 中间点击
cv2_EVENT_LBUTTONUP 4 左键释放
cv2_EVENT_RBUTTONUP 5 右键释放
cv2_EVENT_MBUTTONUP 6 中间释放
cv2_EVENT_LBUTTONDBLCLK 7 左键双击
cv2_EVENT_RBUTTONDBLCLK 8 右键双击
cv2_EVENT_MBUTTONDBLCLK 9 中间释放
cv2_EVENT_FLAG_LBUTTON 1 左键拖拽
cv2_EVENT_FLAG_RBUTTON 2 右键拖拽
cv2_EVENT_FLAG_MBUTTON 4 中间拖拽
cv2_EVENT_FLAG_CTRLKEY 8 (8~15)按Ctrl不放事件
cv2_EVENT_FLAG_SHIFTKEY 16 (16~31)按Shift不放事件
cv2_EVENT_FLAG_ALTKEY 32 (32~39)按Alt不放事件(后面8-39还有待研究)
实例1 :双击左键画圆圈
用到的EVENT为:cv2_EVENT_LBUTTONDBLCLK
所有的鼠标事件回调函数都有一个统一的格式,他们所不同的地方仅仅是
被调用后的功能。我们的鼠标事件回调函数只用做一件事:在双击过的地方绘
制一个圆圈。下面是代码,不懂的地方可以看看注释。
-
import cv2
-
import numpy
as np
-
import time
-
-
-
img=cv2.imread(
'PIC/000.jpg')
#读取图片作为背景
-
-
#定义画圆事件,如果事件双击左键发生
-
#则以此时双击的点为原点画一个半径为100px BGR为(255,255,0)粗细为3px的圆圈
-
def draw_circle(event,x,y,flags,param):
-
-
if event==cv2.EVENT_LBUTTONDBLCLK:
-
cv2.circle(img,(x,y),
100,(
255,
255,
0),
3)
-
-
# 创建图像与窗口并将窗口与回调函数绑定
-
cv2.namedWindow(
'image')
-
cv2.setMouseCallback(
'image',draw_circle)
-
-
-
while(
1):
-
cv2.imshow(
'image',img)
-
if cv2.waitKey(
100) == ord(
'q'):
#等待100毫秒 刷新一次显示图像
-
break
-
cv2.destroyAllWindows()
运行结果:
实例2
现在我们来创建一个更好的程序。这次我们的程序要完成的任务是根据我
们选择的模式在拖动鼠标时绘制矩形或者是圆圈(就像画图程序中一样)。所以
我们的回调函数包含两部分,一部分画矩形,一部分画圆圈。这是一个典型的
例子他可以帮助我们更好理解与构建人机交互式程序,比如物体跟踪,图像分
割等。
下面我们要把这个回调函数与 OpenCV 窗口绑定在一起。在主循环中我
们需要将键盘上的“m”键与模式转换绑定在一起。
-
import cv2
-
import numpy
as np
-
import time
-
-
img=cv2.imread(
'PIC/000.jpg')
-
-
# 当鼠标按下时变为True
-
drawing=
False
-
# 如果mode 为true 绘制矩形。按下'm' 变成绘制曲线。
-
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
-
# 当鼠标左键按下并移动是绘制图形。event 可以查看移动,flag 查看是否按下
-
elif event==cv2.EVENT_MOUSEMOVE
and flags==cv2.EVENT_FLAG_LBUTTON:
-
if drawing==
True:
-
if mode==
True:
-
cv2.rectangle(img,(ix,iy),(x,y),(
0,
255,
0),
-1)
-
else:
-
# 绘制圆圈,小圆点连在一起就成了线
-
cv2.circle(img,(x,y),
3,(
0,
0,
255),
-1)
-
-
# 当鼠标松开停止绘画。
-
elif event==cv2.EVENT_LBUTTONUP:
-
drawing==
False
-
-
-
-
-
cv2.namedWindow(
'image')
-
cv2.setMouseCallback(
'image',draw_circle)
-
while(
1):
-
cv2.imshow(
'image',img)
-
k=cv2.waitKey(
1)&
0xFF
-
if k==ord(
'm'):
-
mode=
not mode
-
elif k==ord(
'q'):
-
break
运行结果:
全部代码:
-
'''函数:cv2.setMouseCallback()'''
-
-
import cv2
-
import numpy
as np
-
import time
-
-
-
img=cv2.imread(
'PIC/000.jpg')
-
-
def draw_circle(event,x,y,flags,param):
-
-
if event==cv2.EVENT_LBUTTONDBLCLK:
-
cv2.circle(img,(x,y),
100,(
255,
255,
0),
3)
-
-
cv2.namedWindow(
'image')
-
cv2.setMouseCallback(
'image',draw_circle)
-
-
-
while(
1):
-
cv2.imshow(
'image',img)
-
if cv2.waitKey(
100) == ord(
'q'):
#等待100毫秒 刷新一次显示图像
-
break
-
cv2.destroyAllWindows()
-
-
-
-
-
# 当鼠标按下时变为True
-
drawing=
False
-
# 如果mode 为true 绘制矩形。按下'm' 变成绘制曲线。
-
mode=
True
-
ix,iy=
-1,
-1
-
6
-
-
-
# 创建回调函数
-
def draw_circle(event,x,y,flags,param):
-
global ix,iy,drawing,mode
-
# 当按下左键是返回起始位置坐标
-
if event==cv2.EVENT_LBUTTONDOWN:
-
drawing=
True
-
ix,iy=x,y
-
# 当鼠标左键按下并移动是绘制图形。event 可以查看移动,flag 查看是否按下
-
elif event==cv2.EVENT_MOUSEMOVE
and flags==cv2.EVENT_FLAG_LBUTTON:
-
if drawing==
True:
-
if mode==
True:
-
cv2.rectangle(img,(ix,iy),(x,y),(
0,
255,
0),
-1)
-
else:
-
# 绘制圆圈,小圆点连在一起就成了线
-
cv2.circle(img,(x,y),
3,(
0,
0,
255),
-1)
-
-
# 当鼠标松开停止绘画。
-
elif event==cv2.EVENT_LBUTTONUP:
-
drawing==
False
-
-
-
-
-
img=cv2.imread(
'PIC/000.jpg')
-
cv2.namedWindow(
'image')
-
cv2.setMouseCallback(
'image',draw_circle)
-
while(
1):
-
cv2.imshow(
'image',img)
-
k=cv2.waitKey(
1)&
0xFF
-
if k==ord(
'm'):
-
mode=
not mode
-
elif k==ord(
'q'):
-
break
<script>
(function(){
function setArticleH(btnReadmore,posi){
var winH = $(window).height();
var articleBox = $("div.article_content");
var artH = articleBox.height();
if(artH > winH*posi){
articleBox.css({
'height':winH*posi+'px',
'overflow':'hidden'
})
btnReadmore.click(function(){
if(typeof window.localStorage === "object" && typeof window.csdn.anonymousUserLimit === "object"){
if(!window.csdn.anonymousUserLimit.judgment()){
window.csdn.anonymousUserLimit.Jumplogin();
return false;
}else if(!currentUserName){
window.csdn.anonymousUserLimit.updata();
}
}
articleBox.removeAttr("style");
$(this).parent().remove();
})
}else{
btnReadmore.parent().remove();
}
}
var btnReadmore = $("#btn-readmore");
if(btnReadmore.length>0){
if(currentUserName){
setArticleH(btnReadmore,3);
}else{
setArticleH(btnReadmore,1.2);
}
}
})()
</script>
</article>