会变魔术的 OpenCV_02 GUI特性


🤵 AuthorHorizon John

编程技巧篇各种操作小结

🎇 机器视觉篇会变魔术 OpenCV

💥 深度学习篇简单入门 PyTorch

🏆 神经网络篇经典网络模型

💻 算法篇再忙也别忘了 LeetCode


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 加载的彩色图像通道为 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()

在这里插入图片描述


鼠标作为画笔

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

导轨栏作为调色板

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官方文档链接🔗 :OpenCV-Python 官方文档

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

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


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Horizon John

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值