软硬件环境
- ubuntu 18.04 64bit
- anaconda with python 3.6
- imutils 0.5.2
imutils简介
imutils
是Adrian Rosebrock开发的一个python
工具包,它整合了opencv
、numpy
和matplotlib
的相关操作,主要是用来进行图形图像的处理,如图像的平移、旋转、缩放、骨架提取、显示等等,后期又加入了针对视频的处理,如摄像头、本地文件等。imutils
同时支持python2
和python3
。
安装`imutils`
1pip install imutils
如果需要查看源码的话,可以通过命令pip download imutils
来下载
图片处理
图片的平移
图片的平移是指将图片在X
轴或Y
轴上移动。opencv
中也提供了图片平移的实现,首先需要根据X
和Y
轴上的变化构建一个平移矩阵M
,如下
然后调用cv2.warpAffine()
实现平移。imutils
封装了opencv
中的平移操作。
1import cv2
2import imutils
3
4image = cv2.imread('dj.jpeg')
5translated = imutils.translate(image, 25, -75)
6cv2.imwrite('translated.jpg', translated)translated
图片的旋转
方法是imutils.rotate()
,跟2个参数,第一个是图片数据,第二个是旋转的角度,旋转是朝逆时针方向。同时imutils
还提供了另一个相似的方法, rotate_round()
,它就是按顺时针旋转的。
1import cv2
2import imutils
3
4image = cv2.imread('dj.jpeg')
5rotated = imutils.rotate(image, 90)
6cv2.imwrite('rotated_90.jpg', rotated)
7
8rotated_round = imutils.rotate_bound(image, 90)
9cv2.imwrite('rotated_90_round.jpg', rotated_round)rotated
图片的缩放
对图片的缩放,imutils
是会保持原有图片的宽高比的, 函数是imutils.resize()
,方法中可以指定宽度width=
或者height=
,两者取其一就可以了。
1import cv2
2import imutils
3
4image = cv2.imread('dj.jpeg')
5resized = imutils.resize(image, width=200)
6cv2.imwrite('resized_width_200.jpg', resized) resized
骨架提取
Skeletonization
,骨架提取,是指对图片中的物体进行拓扑骨架(topological skeleton
)构建的过程。imutils
提供的方法是skeletonize()
,第二个参数是结构参数的尺寸(structuring element
),相当于是一个粒度,越小需要处理的时间越长。
1import cv2
2import imutils
3
4image = cv2.imread('dj.jpeg')
5gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
6
7skeleton = imutils.skeletonize(gray, size=(3, 3))
8cv2.imwrite('skeleton.jpg', skeleton)skeleton
使用matplotlib显示
在opencv
中,图形是表示成numpy
数组的,且是BGR
的序列,显示的话使用cv2.imshow
就可以了,但是在matplotlib
中,需要的是RGB
序列。解决方法有两种:
- 使用
cv2.cvtColor
进行转换 - 使用
imutils.opencv2matplotlib
进行转换
1import imutils
2import cv2
3import matplotlib.pyplot as plt
4
5image = cv2.imread('dj.jpeg')
6plt.figure('Incorrect')
7plt.imshow(imutils.opencv2matplotlib(image))
8plt.show() skeleton
视频处理
这里以摄像头数据处理为例,本地视频文件的处理就是打开方式不同而已。
1from threading import Thread
2import cv2
3
4class WebcamVideoStream:
5 def __init__(self, src=0, name="WebcamVideoStream"):
6 '''
7 类WebcamVideoStream的构造函数,通过指定src参数打开特定的摄像头,并读取第一帧的数据
8 '''
9
10 self.stream = cv2.VideoCapture(src)
11 (self.grabbed, self.frame) = self.stream.read()
12
13 # 线程名
14 self.name = name
15
16 # 线程是否结束的标志
17 self.stopped = False
18
19 def start(self):
20 # 启动读取视频帧的线程
21 t = Thread(target=self.update, name=self.name, args=())
22 t.daemon = True
23 t.start()
24 return self
25
26 def update(self):
27
28 while True:
29
30 if self.stopped:
31 return
32
33 # 读取下一帧数据
34 (self.grabbed, self.frame) = self.stream.read()
35
36 def read(self):
37
38 # 返回当前读取的视频帧
39 return self.frame
40
41 def stop(self):
42
43 # 停止线程
44 self.stopped = True
代码实现比较简单,相信都看得懂,这里不再解释;视频处理还有个重要的参数fps
, 即每秒钟处理的帧数,imutils
采用了最简单的实现方法,总平均帧数法即总的帧数除以所花费的时间。
1import datetime
2
3class FPS:
4 def __init__(self):
5 # 构造函数
6 self._start = None
7 self._end = None
8 self._numFrames = 0
9
10 def start(self):
11 # 开始时间
12 self._start = datetime.datetime.now()
13 return self
14
15 def stop(self):
16 # 结束时间
17 self._end = datetime.datetime.now()
18
19 def update(self):
20 # 统计帧数
21 self._numFrames += 1
22
23 def elapsed(self):
24 # 计算消耗的时间,单位为秒
25 return (self._end - self._start).total_seconds()
26
27 def fps(self):
28
29 return self._numFrames / self.elapsed()
一点补充
大神Adrian Rosebrock
自己维护了一个个人博客网站,地址是 https://www.pyimagesearch.com, 不定期放出计算机视觉及人工智能相关的教程,解释详尽,图文并茂,更赞的是还附带全部源码,非常值得经常去逛逛。
https://github.com/jrosebr1/imutils
https://en.wikipedia.org/wiki/Structuring_element