OpenCV读书笔记之一 --OpenCV中的GUI特性

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()

你可能感兴趣的:(OpenCV,计算机视觉,opencv,计算机视觉,python)