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


Comments

comments powered by Disqus