文章目录
前言
为了更好地利用树莓派进行视觉处理,我从现在开始学习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)
接下来我们分析一下视频读取和处理的原理:
视频有两个参数,可以命名为open和frame
其中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内播放完毕,速度极快。同理,设置的时间越长,播放视频的速度越慢,通常也可以用这个办法进行视频的快放和慢放。