python opencv鼠标事件实现画框圈定目标获取坐标信息
本文实例为大家分享了python-opencv鼠标事件画框圈定目标的具体代码,供大家参考,具体内容如下
在视频/相机中,用鼠标画矩形框,圈定目标,从而获得鼠标的起始坐标点a、终止坐标点b
#-*-coding:utf-8-*-
"""
CreatedonTueDec2709:32:022016
@author:http://blog.csdn.net/lql0716
"""
importcv2
importnumpyasnp
current_pos=None
tl=None
br=None
#鼠标事件
defget_rect(im,title='get_rect'):#(a,b)=get_rect(im,title='get_rect')
mouse_params={'tl':None,'br':None,'current_pos':None,
'released_once':False}
cv2.namedWindow(title)
cv2.moveWindow(title,100,100)
defonMouse(event,x,y,flags,param):
param['current_pos']=(x,y)
ifparam['tl']isnotNoneandnot(flags&cv2.EVENT_FLAG_LBUTTON):
param['released_once']=True
ifflags&cv2.EVENT_FLAG_LBUTTON:
ifparam['tl']isNone:
param['tl']=param['current_pos']
elifparam['released_once']:
param['br']=param['current_pos']
cv2.setMouseCallback(title,onMouse,mouse_params)
cv2.imshow(title,im)
whilemouse_params['br']isNone:
im_draw=np.copy(im)
ifmouse_params['tl']isnotNone:
cv2.rectangle(im_draw,mouse_params['tl'],
mouse_params['current_pos'],(255,0,0))
cv2.imshow(title,im_draw)
_=cv2.waitKey(10)
cv2.destroyWindow(title)
tl=(min(mouse_params['tl'][0],mouse_params['br'][0]),
min(mouse_params['tl'][1],mouse_params['br'][1]))
br=(max(mouse_params['tl'][0],mouse_params['br'][0]),
max(mouse_params['tl'][1],mouse_params['br'][1]))
return(tl,br)#tl=(y1,x1),br=(y2,x2)
#读取摄像头/视频,然后用鼠标事件画框
defreadVideo(pathName,skipFrame):#pathName为视频文件路径,skipFrame为视频的第skipFrame帧
cap=cv2.VideoCapture(0)#读取摄像头
ifnotcap.isOpened():#如果为发现摄像头,则按照路径pathName读取视频文件
cap=cv2.VideoCapture(pathName)#读取视频文件,如pathName='D:/test/test.mp4'
c=1
while(cap.isOpened()):
ret,frame=cap.read()
gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
if(c>=skipFrame):
mask=np.zeros(gray.shape,dtype=np.uint8)#掩码操作,该矩阵与图片大小类型一致,为初始化全0像素值,之后对其操作区域赋值为1即可
if(c==skipFrame):
(a,b)=get_rect(frame,title='get_rect')#鼠标画矩形框
img01,img02=frame,frame
gray01,gray02=gray,gray
else:
img1,img2=prev_frame,frame
gray1,gray2=prev_frame,frame
cv2.imshow('frame',frame)
c=c+1
prev_gray=gray
prev_frame=frame
ifcv2.waitKey(1)&0xFF==ord('q'):#点击视频窗口,按q键退出
break
cap.release()
cv2.destroyAllWindows()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。