赞
踩
为了更好地利用树莓派进行视觉处理,我从现在开始学习opencv并进行记录分享。
学习opencv的目的是为了对摄像头捕获到的图像信息进行处理,例如:人脸识别即是由摄像头捕获到人脸特征信息,再通过特殊的通信手段,将这些信息发送到微处理器进行下一步的处理。那么,本篇文章记录的就是最基本的图片、视频的读取和处理操作 。
首先来看一段最简单的代码
- import cv2 #导入opencv视觉库
-
- img = cv2.imread('cat.jpg') #读取图片,并放入“img”里
- cv2.imshow('image', img) #创建一个名为‘image’的窗口,显示img这张图片
- cv2.waitKey(0) #显示一段时间
- cv2.destroyAllWindows() #销毁所有的窗口
这段代码每一行的作用都已经注释在后面了,我主要记录一下opencv库各个函数的具体用法。
大部分的opencv函数都是“cv2.”后面接函数名
例如:要读取一张图片就可以使用 cv2.imread(' 图片地址'),需要特别注意的是图片地址的格式,如果这张图片在python程序的同一个文件夹中,可以直接将图片地址写为图片名称,例如:
cv2.imread('cat.jpg')
相反的,如果图片不在python程序的同一文件夹中,那么则需要写上完整的图片地址,并在地址前加上转义字符‘r’来避免由“\”带来的错误,例如:
cv2.imread(r'C:\Users\26835\Desktop\picture\cat.jpg')
这是一个显示函数,会创建一个窗口,并显示指定的图片
这条代码可以让图片显示一段指定时间,但并不准确。
需要注意的是,只有当括号内为非0时才会有效,例如:
cv2.waitKey(100) #显示大约100ms
销毁所有的窗口
这条代码可以修改图片的尺寸大小,其中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)
修改图片大小的手段主要用于方便进行图片的数值计算、图像融合等
这条代码可以用来修改显示窗口的大小
这条代码不是一个函数,而是一个常用的切片操作,有时我们不需要处理整张照片,而只需要其中的某一块位置进行处理,就可以通过切片的方式取出对应的部分,具体用法如下:
- 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是否为空来检查视频内容是否有问题
接下来,我们分析一下处理视频时使用的函数
这是颜色空间转换函数,这里将BGR转换成GRAY,即将彩色图像转换为灰度图,这样通常是为了在做图像处理时,减少颜色混乱带来的识别困难问题
这段代码是用来关闭显示窗口,与之前不同的是,它除了可以通过等待10ms来自动关闭,也可以通过按下“Esc”来关闭,‘27’代表的就是“Esc”。也可以设置成其他按键关闭,例如常用的0xff == ‘q’
需要特别注意的是,使用cv2.waitKey(10)时,会改变视频的运行速度,如果设置为10ms,视频会在10ms内播放完毕,速度极快。同理,设置的时间越长,播放视频的速度越慢,通常也可以用这个办法进行视频的快放和慢放。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。