OpenCV:01图片&视频的加载显示

本文详细介绍了如何使用OpenCV进行图像和视频的加载、显示、保存以及摄像头和视频数据的处理。内容涵盖OpenCV的窗口操作、读取图片、封装函数、保存图片、读取摄像头和视频数据、视频处理、视频录制、视频播放控制、视频属性和保存、鼠标控制及TrackBar应用等。
摘要由CSDN通过智能技术生成

学习目标:

  • 了解OpenCV的运行机制
  • 可以使用OpenCV处理一些图像常见问题
  • 学会物体识别,文字识别等问题的处理思路

图像与视频的加载显示

导入OpenCV的包cv2

# 导入opencv的包
import cv2

窗口操作

cv2.imshow('window',0) # imshow(winname, mat):'mat’表示展示的内容,0表示什么都不展示

# 创建窗口
#cv2.namedWindow('window',cv2.WINDOW_AUTOSIZE)
cv2.namedWindow('window',cv2.WINDOW_NORMAL)

# 更改窗口大小—>在窗口属性为‘WINDOW_AUTOSIZE’自动设置时无效果
cv2.resizeWindow('window',800,600) # resizeWindow(winname, width, height)

# 展示名字为window的窗口
cv2.imshow('window',0) # imshow(winname, mat):'mat'表示展示的内容,0表示什么都不展示

# 等待按键
#cv2.waitKey(0) # waitKey会返回按下按键的ASCII值(8位)
              # 值为‘0’表示接受任意按键,如果给其他的整数,表示等待按键的时间(单位:毫秒ms)
            # 比如waitKey(5000)如果5000ms后没有按键,则窗口无响应
        # 可以用waitKey来销毁窗口,不用每次都重启python
key = cv2.waitKey(0)
if key == ord('q'): # 如果按下键盘上的'q'
    print("准备销毁窗口")
    cv2.destroyAllWindows() # 销毁窗口

计算按键的ASCII

# 怎么计算按键'x'的ASCII码
# ord()是python中计算ASCII值的函数
ord('q')

读取图片

cv2.imread('./cat.jpeg') # ./是直接调用day1目录下的文件

用其他插件来读取(以matplotlib为例)

先将图片存入我们的文件夹下,命名为cat.jpeg
在这里插入图片描述

import matplotlib.pyplot as plt
# 默认按照彩色图片来读取
cat = cv2.imread('./cat.jpeg') # ./是直接调用day1目录下的文件

# 调出cat的值
cat


# 利用matplotlib来显示图像
plt.imshow(cat)

# 我们会发现matplotlib显示的图片和真实的图片颜色不一样,发生了变化
    # 因为opencv读进来的通道不是默认的RGB(红绿蓝)通道,而是BGR(蓝绿红)
    # 因此opencv读进来的图片不要用别的方式去展示(如matplotlib),而是用opencv自带的方式去展示

注意:单独调用imshow()时可以不用创建窗口,opencv会自动生成
在这里插入图片描述


OpenCV自带的方式去展示图片

cv2.imshow('cat',cat)
key = cv2.waitKey(0)
if key == ord('q'): # 如果按下键盘上的'q'
    print("准备销毁窗口")
    cv2.destroyAllWindows() # 销毁窗口
    
# 执行时会弹出窗口,显示图片     按‘q’则退出窗口

函数的封装

如果我们需要频繁地显示图片,那么我们可以把显示图片的方法封装成一个函数方便我们显示图片

把这个函数放在一个文件里,需要使用的话就直接导入文件即可

将函数保存为.py文件(命名为utils.py),放在我们的文件夹中

# 如果我们需要频繁地显示图片,那么我们可以把显示图片的方法封装成一个函数方便我们显示图片
    # 把这个函数放在一个文件里,需要使用的话就直接导入文件即可
def cv_show(name,img):
    import cv2
    cv2.imshow(name,img)
    
    # 关闭窗口
    key = cv2.waitKey(0)
    if key  == ord('q') or key == ord('Q'):
        cv2.destroyAllWindows()

想要调用函数时,我们导入文件即可

# 从外部py文件中导入工具类,即可直接使用
from utils import cv_show

注意:导入后必须先执行文件!

# 导入后必须先执行文件
%run utils.py

# 如果出现报错IndentationError:unindent does not match any outer indentation level
    # 那就是Tab和空格混用的缩进问题:本应该用Tab缩进,可能打成了空格缩进

使用函数

cv_show('cat',cat)

保存图片

imwrite(path,img):使用imwrite保存图片

import cv2

# 创建一个窗口
cv2.namedWindow('img',cv2.WINDOW_NORMAL)
cv2.resizeWindow('img',640,480)

# 读一个图片
img = cv2.imread('./cat.jpeg') # 打开当前目录下的图像文件

while True:# 进入循环,使得cv2不停地展示img图片
    cv2.imshow('img',img)
    key = cv2.waitKey(0) # 接受任意字符——>写0
    
    if key == ord('q'): # 按下按键'q'——> quit
        break
    elif key == ord('s'): # 按下按键's'——> save
        cv2.imwrite('./123.png',img) # 会把cv2.imshow('img',img)的图片保存到当前文件下下,命名为123.png
    else:
        print(key)

# 关闭窗口
cv2.destroyAllWindows()

在这里插入图片描述


读取摄像头与视频数据

打开摄像头

  • 视频是由图片组成的,视频的每一帧就是一幅图片,一般是30帧,表示1s显示30张图片
  • cv2.VideoCapture()可以捕获摄像头,用数字来表示不同的设备,比如0,1
  • 如果是视频文件,可以直接指定路径即可
import cv2
# VideoCapture()可以捕获摄像头:如果是视频文件,则直接在参数中写入路径即可;如果是电脑上的摄像头,则可以根据摄像头编号进行索引,通过这个简单的数字去指定调用的摄像头


# 打开视频文件 #
#vc = cv2.VideoCapture()  

# 打开摄像头 #
cv2.namedWindow('video',cv2.WINDOW_NORMAL)
cv2.resizeWindow('video',640,480)

# 如果打开失败或者没读到数据,会闪退,但并不会报错
#cap = cv2.VideoCapture(1)

cap = cv2.VideoCapture(0) # 该函数会返回一个对象,我们用cap来接受(0是笔记本自带的摄像头)

# 循环读取摄像头的每一帧
while True:
    # 读一帧数据(一帧=视频里的一幅图) 
    flag,frame = cap.read() # 返回“标记”和“这一帧数据(图片)”:True表示读取成功,False表示读取失败
    
    # 可以根据flag做判断
    if not flag:
        print("没读到数据!退出......")
        break
        
    # 显示数据
    else:
        cv2.imshow('video',frame)
        
    key = cv2.waitKey(1) # 此处不可以写0!因为0会允许任何输入并且一直在等待输入,如果这样写就只能看到一帧数据,并且一直在等待
                         # 此处写1,每隔1ms检测一次输入
    if key 
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值