目录
前言:
1、窗口控制
2、绘制直线矩形椭圆文本箭头等
3、响应鼠标事件
4、使用跟踪栏
总结:
OpenCV的图像用户界面(Graphical User Interface,GUI)的功能主要包括图像的读写和显示、视频的读写和显示、窗口控制(创建,大小,关闭)、绘图、响应鼠标事件和使用跟踪栏等。
创建cv2.namedWindow(winName,flags)。属性常量flags有NORMAL:可调整大小,无限制;AUTOSIZE:默认值,无法调整大小,大小由图像决定;FULLSCREEN:窗口全屏显示;GUI_EXPANDED:窗口可显示状态栏和工具栏;FREERATIO:尽可能多的显示图片,无比例限制;KEEPRATIO:窗口由图像比例决定。
关闭cv2.destroyAllWindows(),表示关闭所有窗口,cv2.destroyWindow(winName)表示关闭指定名字的窗口。
调整大小cv2.resizeWindow(winName,size),size是一个二元组如(240,320)这种。
绘制多边形polylines(img,pts,isclosed,color,thickness)。pts是各点的坐标通常放在一个数组里,isclosed为True时封闭连接,否则不封闭。
绘制文本putText(img,text,org,fontFace,fontScale,color,thickness)。text为文本,org为文本左下角的位置,fontFace为字体类型,fontScale为字体大小。
import cv2
import numpy as np
img = np.zeros((480,640,3),np.uint8)+255#创建纯白背景用于画图
cv2.line(img,(40,50),(80,100),(255,0,0),4)
cv2.rectangle(img,(80,100),(380,380),(0,255,0),3)#rectangle(img,左上角坐标,右下角坐标,颜色,粗细)
cv2.circle(img,(320,240),50,(0,0,255),3,16)#circle(img,圆心坐标,半径,颜色,线宽,精细度)后两个参数可选填
cv2.ellipse(img,(320,240),(100,50),0,0,360,(0,0,255),5,16)#椭圆ellipse(img,中心点,长宽的一半,角度,从哪个角度开始,从哪个角度结束)
pts=np.array([[10,20],[20,30],[30,15],[25,60],[50,80]],np.int32)
cv2.polylines(img,[pts],True,(255,0,0),3)#随便给的点可能四不像
cv2.putText(img,'Hello opencv',(20,100),cv2.FONT_HERSHEY_COMPLEX,2,(0,0,255))
cv2.imshow('draw',img)
cv2.waitKey()
cv2.destroyAllWindows()
除了上面代码示例中的参数,一般它们最后都有两个参数:lineType线条类型和shift参数,lineType默认值是cv2.Line_8一般不需要设置;shift坐标的数值精度,一般也不需要设置。lineType包括FILLED:填充、LINE_4:4条连接线、LINE_8:8条连接线、LINE_AA:抗锯齿线,更平滑。
OpenCV可在用户触发鼠标事件时,调用鼠标回调函数完成事件处理,鼠标回调函数是自定义函数,基本格式:
def mouseCallback(event,x,y,flags,param):
...
mouseCallback是自定义名称;event是调用时传递给函数的鼠标事件对象;x和y为触发鼠标事件时,鼠标指针在窗口中的坐标(x,y);flags为触发鼠标事件时,鼠标拖动或键盘按键操作,参数由按下鼠标左键、释放鼠标左键、双击左键、按下ctrl等等;param是传递给回调函数的其他数据。
cv2.setMouseCallback()函数用于图像窗口绑定鼠标回调函数,格式如下:
cv2.setMouseCallback(wname,mouseCallback)
wname是窗口名字,后者是回调函数名称。
img=np.zeros((200,320,3),np.uint8)+255
def draw(event,x,y,flag,param):
if event==cv2.EVENT_LBUTTONDBLCLK:
cv2.circle(img,(x,y),20,(255,0,0),-1)#双击鼠标左键开始画圆,坐标x,y就是鼠标点击的位置
elif event==cv2.EVENT_RBUTTONDBLCLK:
cv2.rectangle(img,(x,y),(x+20,y+20),(0,0,255),-1)#双击鼠标右键开始画矩形
cv2.namedWindow('drawing')
cv2.setMouseCallback('drawing',draw)
while True:
cv2.imshow('drawing',img)
k=cv2.waitKey(1)
if k==27:#按esc结束
break
cv2.destroyAllWindows()
跟踪栏(Trackbar)是OpenCV为图像窗口提供的交互工具,可以通过跟踪栏的滑块位置获取特定范围内的值。
cv2.createTrackbar(trackbarname,wname,value,count,onChange,userdata)用于创建跟踪栏。value是跟踪栏中滑块的初始位置;count是跟踪栏的最大值,最小值为0;onChange为跟踪栏滑块位置变化时调用的回调函数名称;userdata为传递给回调函数的其他可选数据。
cv2.getTrackbarPos(trackbarname,wname)函数用于返回跟踪栏的当前值。
img=np.zeros((120,400,3),np.uint8)#创建黑色图像
def doChange(x):
b=cv2.getTrackbarPos('B','window')
g=cv2.getTrackbarPos('G','window')
r=cv2.getTrackbarPos('R','window')
img[:]=[b,g,r]#改变图像
cv2.namedWindow('window')
cv2.createTrackbar('B','window',0,255,doChange)
cv2.createTrackbar('G','window',0,255,doChange)
cv2.createTrackbar('R','window',0,255,doChange)
while True:
cv2.imshow('window',img)
k = cv2.waitKey(1)
if k==27:#按esc结束
break
cv2.destroyAllWin
拖动bar下面颜色会变化,与PS调色板相似!!
由于是初学者可能很多地方没有总结完全或者有误,后续深入学习后会不断回来该删,也欢迎各位朋友指正!下次学习图像变换!