OpenCV学习记录——图片、视频的读取处理

本文详细介绍了如何使用OpenCV库在Python中读取和处理图片与视频,包括基本的显示、尺寸调整、颜色空间转换以及视频播放控制。通过实例展示了cv2.imread、cv2.imshow等关键函数的用法。
摘要由CSDN通过智能技术生成

文章目录


前言

为了更好地利用树莓派进行视觉处理,我从现在开始学习opencv并进行记录分享。

一、学习目的

        学习opencv的目的是为了对摄像头捕获到的图像信息进行处理,例如:人脸识别即是由摄像头捕获到人脸特征信息,再通过特殊的通信手段,将这些信息发送到微处理器进行下一步的处理。那么,本篇文章记录的就是最基本图片、视频的读取和处理操作 。

二、代码分析(读取图片)

首先来看一段最简单的代码

import cv2                   #导入opencv视觉库

img = cv2.imread('cat.jpg')  #读取图片,并放入“img”里
cv2.imshow('image', img)     #创建一个名为‘image’的窗口,显示img这张图片
cv2.waitKey(0)               #显示一段时间
cv2.destroyAllWindows()      #销毁所有的窗口

        这段代码每一行的作用都已经注释在后面了,我主要记录一下opencv库各个函数的具体用法

(1) cv2.imread('图片地址')

        大部分的opencv函数都是“cv2.”后面接函数名

        例如:要读取一张图片就可以使用  cv2.imread(' 图片地址'),需要特别注意的是图片地址的格式,如果这张图片在python程序的同一个文件夹中,可以直接将图片地址写为图片名称,例如:

cv2.imread('cat.jpg')

        相反的,如果图片不在python程序的同一文件夹中,那么则需要写上完整的图片地址,并在地址前加上转义字符‘r’来避免由“\”带来的错误,例如:

cv2.imread(r'C:\Users\26835\Desktop\picture\cat.jpg')

(2) cv2.imshow('窗口名称', 图片)

        这是一个显示函数,会创建一个窗口,并显示指定的图片

(3) cv2.waitKey(0)

        这条代码可以让图片显示一段指定时间,但并不准确。

        需要注意的是,只有当括号内为非0时才会有效,例如:

cv2.waitKey(100)   #显示大约100ms

(4) cv2.destroyAllWindows() 

        销毁所有的窗口

除了以上最基本的显示操作外,还有一些基本的处理操作如下:

(5) cv2.resize(img, (480, 640))

        这条代码可以修改图片的尺寸大小,其中img为读取的图片,480为图片的宽度参数,640为图片的高度参数,参数都可以根据需要自定义,具体用法如下:

img = cv2.imread('cat.jpg')         #读取图片
img = cv2.resize(img, (480, 640))   #修改图片大小

        修改图片大小还有另一种方法,同样采用cv2.resize()函数:cv2.resize(img, (0, 0), fx=3, fy=1)

        可以将原本的参数都改成0,用fx=、fy=来表示宽度高度倍数关系,例如:

img = cv2.imread('cat.jpg')
img = cv2.resize(img, (0, 0), fx=3, fy=1)

        修改图片大小的手段主要用于方便进行图片的数值计算图像融合

(6) cv2.resizeWindow('name', 480, 640)

        这条代码可以用来修改显示窗口的大小

(7) cap = img[0:100, 0:100]

        这条代码不是一个函数,而是一个常用的切片操作,有时我们不需要处理整张照片,而只需要其中的某一块位置进行处理,就可以通过切片的方式取出对应的部分,具体用法如下:

img = cv2.imread('cat.jpg')
cap = img[0:100, 0:100]       #取出宽为0-100,高为0-100的部分

cv2.imshow('image', cap)      #显示选择的内容
cv2.waitKey(0)
cv2.destroyAllWindows()

二、代码分析(读取视频)

还是先看一下完整码代码

import cv2     #导入opencv视觉库

vc = cv2.VideoCapture('cat.MP4')  #获取视频,若需要调用摄像头,则为vc = cv2.VideoCapture(0)

if vc.isOpened():     #检查视频是否能打开
    open, frame  = vc.read()    #如果能打开,则获取视频的两个参数:open、frame
else:
    open = False            #不能打开则将open设置为False,即表示不能打开

while open:                 #当open的值为非0时进入以下循环
    ret, frame = vc.read()  #先获取参数,frame为是视频本身,即视频的数字化表示
    if frame is None:       #判断,frame是否为空
        break               #如果为空,则跳出循环,即没有读取到视频
    if ret == True:         #如果ret为Ture,则表示可以打开视频
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)   #调整视频的颜色为灰色
        cv2.imshow('video', gray)                        #显示视频
        if cv2.waitKey(10) & 0xff == 27:                 #显示10ms,或者按下Esc退出窗口
            break
vc.release()                #释放窗口
cv2.destroyAllWindows()     #销毁所有窗口

        代码的大致作用已经注释在后面了,其中需要注意的是vc = cv2.VideoCapture('cat.MP4')中,'cat.MP4'指的是视频地址,如果不是调用视频,而是调用摄像头,则将该参数改为0,此时0代表的是摄像头编号,例如:vc = cv2.VideoCapture(0)

        接下来我们分析一下视频读取和处理的原理:

        视频有两个参数,可以命名为openframe

        其中open代表着该视频是否可以打开,open为0时即不能打开该视频,所以通常在读取视频前通过open参数判断一下,避免由于视频不能打开带来的问题。

        frame代表的是视频本身,视频是由很多张图片构成的,我们可以通过"print(frame)"来看看:

  ...
  ...
  [177 190 198]
  [177 190 198]
  [175 188 196]]]
[[[205 222 233]
  [205 222 233]
  [205 222 233]
  ...
  ...

        这就是打印出来的frame的部分内容

        所以,通常也通过判断frame是否为空来检查视频内容是否有问题

        接下来,我们分析一下处理视频时使用的函数

(1) cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        这是颜色空间转换函数,这里将BGR转换成GRAY,即将彩色图像转换为灰度图,这样通常是为了在做图像处理时,减少颜色混乱带来的识别困难问题

(2) cv2.waitKey(10) & 0xff == 27

        这段代码是用来关闭显示窗口,与之前不同的是,它除了可以通过等待10ms来自动关闭,也可以通过按下“Esc”来关闭,‘27’代表的就是“Esc”。也可以设置成其他按键关闭,例如常用的0xff == ‘q’

        需要特别注意的是,使用cv2.waitKey(10)时,会改变视频的运行速度,如果设置为10ms,视频会在10ms内播放完毕,速度极快。同理,设置的时间越长,播放视频的速度越慢,通常也可以用这个办法进行视频的快放和慢放。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

KAIs32

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

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

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

打赏作者

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

抵扣说明:

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

余额充值