OpenCV的GUI特性
1、图像入门
读取图像
import numpy as np
import cv2 as cv
#加载彩色灰度图像
img = cv.imread('123.jpg',0)
显示图像
cv.imshow('image',img)
cv.waitKey(0) #参数以毫秒为单位,表示键盘绑定函数
cv.destoryWindow('窗口名称') #销毁特定的窗口
cv.destoryAllWindows() #破坏我们创建的所有的窗口
可以创建一个空窗口,将图像加载到该窗口,可以指定窗口是否可调整大小。
cv.namedWindow('image',cv.WINDOW_NORMAL) #cv.WINDOW_NORMAL表示窗口大小可调整,cv.WINDOW_AUTOSIZE表示窗口大小不可调整。
cv.waitKey(0) #参数以毫秒为单位,表示键盘绑定函数
cv.destoryWindow('窗口名称') #销毁特定的窗口
cv.destoryAllWindows() #破坏我们创建的所有的窗口
写入图像
cv.imwrite('123.png',img)
使用Matplotlib
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('123.jpg',0)
plt.imshow(img,cmap='gray',interpolation='bicubic')
plt.xticks([]),plt.yticks([])
plt.show()
使其他参考资源
Matplotlib绘图样式和功能:http://matplotlib.org/api/pyplot_api.html
2、视频入门
1、从相机中读取视频
要捕获视频,你需要创建一个 VideoCapture 对象,参数可以是设备索引或者视频文件的名称。
import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
if not cap.isOpened():
print('cannot open camera')
exit()
while True:
#逐帧捕获
ret,frame = cap.read()
#如果正确读取帧,ret为True
if not ret:
print('not ret')
break
gray = cv.cvtColor(frame,cv.COLOR_BGR2GRAY)
#显示结果帧
cv.imshow('frame',gray)
if cv.waitKey(1) == ord('q'):
break
cap.release()
cv.destroyAllWindows()
2、从文件中播放视频
import numpy as np
import cv2 as cv
cap = cv.VideoCapture('vtest.avi')
if not cap.isOpened():
print('cannot open camera')
exit()
while True:
#逐帧捕获
ret,frame = cap.read()
#如果正确读取帧,ret为True
if not ret:
print('not ret')
break
gray = cv.cvtColor(frame,cv.COLOR_BGR2GRAY)
#显示结果帧
cv.imshow('frame',gray)
if cv.waitKey(1) == ord('q'):
break
cap.release()
cv.destroyAllWindows()
3、保存视频
import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
#定义编解码器并创建videowriter对象
fourcc = cv.VideoWriter_fourcc(*'XVID')
out = cv.VideoWriter('output.avi',fourcc,20.0,(640,480))
while cap.isOpened():
ret,frame = cap.read()
if not ret:
print('not ret')
break
gray = cv.cvtColor(frame,cv.COLOR_BGR2GRAY)
#显示结果帧
cv.imshow('frame',gray)
if cv.waitKey(1) == ord('q'):
break
cap.release()
out.release()
cv.destroyAllWindows()
3、OpenCV的绘图功能
学习使用OpenCV绘制不同的几何形状:
绘图中所需要的参数:
1、img:所需要绘制形状的图像;
2、color:形状的颜色
3、厚度:线或者圆的粗细;
4、lineType:线的类型,为8连线或者抗锯齿线灯。
import numpy as np
import cv2 as cv
#创建一个黑色的图像
img = np.zeros((512,512,3),np.uint8)
#绘制一条蓝色的线
cv.line(img,(0,0),(511,511),(255,0,0),5)
#画矩形,需要矩形的左上角和右下角,绘制一个绿色矩形
cv.rectangle(img,(384,0),(510,128),(0,255,0),3)
#画圆圈,需要中心和半径
cv.circle(img,(477,63),63,(0,0,255),-1)
#画椭圆,需要中心位置,轴长度
cv.ellipse(img,(256,256),(100,50),0,0,180,255,-1)
#画多边形
pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
pts = pts.reshape((-1,1,2))
cv.polylines(img,[pts],True,(0,255,255))
#向图像中添加文本
font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2,cv.LINE_AA)
cv.imshow('image',img)
4、鼠标作为画笔
列出鼠标可以操作的所有的事件
import cv2 as cv
events = [i for i in dir(cv) if 'EVENT' in i]
print(events)
利用鼠标回调函数画一个圆
import numpy as np
import cv2 as cv
# 鼠标回调函数
def draw_circle(event,x,y,flags,param):
if event == cv.EVENT_LBUTTONDBLCLK:
cv.circle(img,(x,y),100,(255,0,0),-1)
# 创建一个黑色的图像,一个窗口,并绑定到窗口的功能
img = np.zeros((512,512,3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image',draw_circle)
while(1):
cv.imshow('image',img)
if cv.waitKey(20) & 0xFF == 27:
break
cv.destroyAllWindows()
我们通过拖动鼠标来绘制矩形或圆形(取决于我们选择的模式)
import numpy as np
import cv2 as cv
drawing = False # 如果按下鼠标,则为真
mode = True # 如果为真,绘制矩形。按 m 键可以切换到曲线
ix,iy = -1,-1
# 鼠标回调函数
def draw_circle(event,x,y,f//]lags,param):
global ix,iy,drawing,mode
if event == cv.EVENT_LBUTTONDOWN:
drawing = True
ix,iy = x,y
elif event == cv.EVENT_MOUSEMOVE:
if drawing == True:
if mode == True:
cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
else:
cv.circle(img,(x,y),5,(0,0,255),-1)
elif event == cv.EVENT_LBUTTONUP:
drawing = False
if mode == True:
cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
else:
cv.circle(img,(x,y),5,(0,0,255),-1)
img = np.zeros((512,512,3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image',draw_circle)
while(1):
cv.imshow('image',img)
if cv.waitKey(20) & 0xFF == 27:
break
cv.destroyAllWindows()
5、轨迹栏作为调色板
通过cv.getTrackbarPos,**cv.createTrackbar**等函数将轨迹栏固定到opencv窗口。
对于cv.getTrackbarPos()函数,第一个参数是轨迹栏名称,第二个参数是它附加到的窗口名称,第三个参数是默认值,第四个参数是最大值,第五个是执行的回调函数每次跟踪栏值更改。回调函数始终具有默认参数,即轨迹栏位置。
轨迹栏的主要应用是用作按钮或开关。
import numpy as np
import cv2 as cv
def nothing(x):
pass
img = np.zeros((300,512,3),np.uint8)
cv.namedWindow('image')
#创建颜色变化的轨迹栏
cv.createTrackbar('R','image',0,255,nothing)
cv.createTrackbar('G','image',0,255,nothing)
cv.createTrackbar('B','image',0,255,nothing)
#为ON/OFF功能创建开关
switch ='0:OFF \n 1:ON'
cv.createTrackbar(switch,'image',0,1,nothing)
while(1):
cv.imshow('image',img)
k = cv.waitKey(1)&0xFF
if k == 27:
break
#得到四条轨迹的当前位置
r = cv.getTrackbarPos('R','image')
g = cv.getTrackbarPos('G','image')
b = cv.getTrackbarPos('B','image')
s = cv.getTrackbarPos(switch,'image')
if s == 0:
img[:] = 0
else:
img[:] = [b,g,r]
cv.destoryAllWindows()