会变魔术的 OpenCV_02 GUI特性


OpenCV是计算机视觉中经典的专用库,其支持多语言、跨平台,功能强大。

如何显示和保存图像和视频,控制鼠标事件以及创建轨迹栏。

文章目录

  • 图像入门
    • 图像读取
    • 图像显示
    • 图像写入
    • 使用Matplotlib
  • 视频入门
    • 视频读取
      • 相机读取
      • 文件读取
    • 视频保存
  • OpenCV中的绘图功能
    • 绘制直线
    • 绘制矩形
    • 绘制圆圈
    • 绘制椭圆
    • 绘制多边形
    • 图像中添加文本
  • 鼠标作为画笔
  • 导轨栏作为调色板

图像入门

图像读取

cv.imread() :读取图像;
cv.IMREAD_COLOR: 加载 彩色 图像,图像透明度都会被忽视(默认)(可以写成 1
cv.IMREAD_GRAYSCALE:加载 灰度 图像(可以写成 0
cv.IMREAD_UNCHANGED:加载图像,包括 alpha通道(可以写成 -1

import cv2 as cv
img = cv.imread('./00.png', -1)   # 等同于cv.IMREAD_UNCHANGED
img = cv.imread('./01.png', 0)    # 等同于cv.IMREAD_GRAYSCALE
img = cv.imread('./02.png', 1)    # 等同于cv.IMREAD_COLOR

图像显示

cv.imshow() :在窗口中显示图像,窗口自动适合图像尺寸,一般使用 cv_show() 函数给封装起来;
默认参数为 cv.WINDOW_AUTOSIZE显示窗口大小不可以调整,
可以通过使用 cv.namedWindow(name, cv.WINDOW_NORMAL) 函数实现窗口的大小调整;

def cv_show(name, img):
	cv.imshow(name, img)
	cv.waitKey(0)
	cv.destroyAllWindows()
cv.namedWindow(name, cv.WINDOW_NORMAL)    # 窗口可调整
cv.imshow(name, img)
cv.waitKey(0)
cv.destroyAllWindows()

图像写入

cv.imwrite() :保存图像;

cv.imwrite('path', img)

使用Matplotlib

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('./00.png', 0)
plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
plt.xticks([]), plt.yticks([])
plt.show()

会变魔术的 OpenCV_02 GUI特性_第1张图片

注:
OpenCV 加载的彩色图像通道为 BGR ,但是 MatplotlibRGB 通道显示。


视频入门

视频读取

cv.VideoCapture()

相机读取

默认分辨率为 640* 480 ,可以通过修改参数,例如 1080* 720 :
cap.set(cv.CAP_PROP_FRAME_WIDTH, 1080)    宽度
cap.set(cv.CAP_PROP_FRAME_HEIGHT, 720)    高度
capture.set(CV_CAP_PROP_FPS, 30)         帧数
capture.set(CV_CAP_PROP_BRIGHTNESS, 1)     亮度
capture.set(CV_CAP_PROP_CONTRAST, 40)     对比度
capture.set(CV_CAP_PROP_SATURATION, 50)   饱和度
capture.set(CV_CAP_PROP_HUE, 50)         色调
capture.set(CV_CAP_PROP_EXPOSURE, 50)     曝光

import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)    # 选择对应的相机,0默认为笔记本自带相机
if not cap.isOpened():
    print("Cannot open camera")
    exit()
while True:
    # 逐帧捕获
    ret, frame = cap.read()    # 如果正确读取帧,ret为True 
    if not ret:
        print("Can't receive frame (stream end?). Exiting ...")
        break
    
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    # 逐帧显示结果
    cv.imshow('frame', gray)
    if cv.waitKey(1) == ord('q'):    # 按 'q' 退出
        break
# 完成所有操作后,释放捕获器
cap.release()
cv.destroyAllWindows()

文件读取

可以利用 cap.set() 函数读取原视频的一些参数,例如宽和高:
cap.get(cv.CAP_PROP_FRAME_WIDTH)
cap.get(cv.CAP_PROP_FRAME_HEIGHT)

import numpy as np
import cv2 as cv
cap = cv.VideoCapture('./00.avi')
while cap.isOpened():
    ret, frame = cap.read()    # 如果正确读取帧,ret为True
    if not ret:
        print("Can't receive frame (stream end?). Exiting ...")
        break
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    cv.imshow('frame', gray)
    if cv.waitKey(1) == ord('q'):
        break
cap.release()
cv.destroyAllWindows()

视频保存

cv.VideoWriter()

import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
fourcc = cv.VideoWriter_fourcc(*'XVID')    # 定义编解码器
out = cv.VideoWriter('output.avi', fourcc, 20.0, (640,  480))    # 创建 VideoWriter 对象
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        print("Can't receive frame (stream end?). Exiting ...")
        break
    # frame = cv.flip(frame, 0)     # 视频翻转
    out.write(frame)
    cv.imshow('frame', frame)
    if cv.waitKey(1) == ord('q'):
        break
# 完成工作后释放所有内容
cap.release()
out.release()
cv.destroyAllWindows()

OpenCV中的绘图功能

绘制直线

cv.line() (图像,起点,终点,颜色,线宽)

import numpy as np
import cv2 as cv
# 创建黑色的图像
img = np.zeros((512,512,3), np.uint8)
# 绘制一条厚度为5的蓝色对角线
cv.line(img, (0,0), (511,511), (255,0,0), 5)

绘制矩形

cv.rectangle() (图像,起点,终点,颜色,线宽)

cv.rectangle(img, (384,0), (510,128), (0,255,0), 3)

绘制圆圈

cv.circle() (图像,圆心,半径,颜色,线宽)

cv.circle(img, (447,63), 63, (0,0,255), -1)

绘制椭圆

cv.ellipse()
(图像,椭圆中心,(长轴半径,短轴半径),
椭圆沿水平方向逆时针旋转的角度,
沿长轴顺时针方向开始显示的角度,
沿长轴顺时针结束显示的角度,
颜色,线宽(cv.FILLED表示实心))

cv.ellipse(img, (256,256), (100,50), 0, 0, 180, (255,0,255), 3)
cv.ellipse(img, (128,128), (100,50), 0, 0, 360, (255,0,255), cv.FILLED)

绘制多边形

cv.polylines()

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))    # 设置为False 绘制折线而不是封闭图形

图像中添加文本

font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img,'OpenCV',(10,500), font, 4, (255,255,255), 2, cv.LINE_AA)

结果显示 :

cv.imshow('test', img)
cv.waitKey(0)
cv.destroyAllWindows()

会变魔术的 OpenCV_02 GUI特性_第2张图片


鼠标作为画笔

cv.setMouseCallback()
鼠标点到的地方绘制一个圆:

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), 10, (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:     # esc 键
        break
cv.destroyAllWindows()
会变魔术的 OpenCV_02 GUI特性_第3张图片

导轨栏作为调色板

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 \n1 : 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.destroyAllWindows()
会变魔术的 OpenCV_02 GUI特性_第4张图片

OpenCV官方文档链接 :OpenCV-Python 官方文档

OpenCV系列链接:会变魔术的 OpenCV

  会变魔术的 OpenCV_01 简介与安装
  会变魔术的 OpenCV_02 GUI特性
  会变魔术的 OpenCV_03 核心操作
  会变魔术的 OpenCV_04 图像处理
  会变魔术的 OpenCV_05 实例分析


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