OpenCV 基础
OpenCV是Open Source Computer Vision Library的简称,是一个被业界广泛使用的图像处理和计算机视觉开发工具库。OpenCV项目由英特尔公司于1999开始开发,2006年,英特尔公司发布OpenCV 1.0 版本,2009年10月发布OpenCV 2.0 版本,目前,OpenCV已经发布了4.0 版本。2012年8月,英特尔公司把OpenCV的营运交由一个非营利组织(OpenCV.org)维护。OpenCV提供了C++、 Python、Java 版本,能够安装在Linux、 MacOS、Windows、iOS、Android等操作系统上。
OpenCV的模块
- Core:核心库,定义了基本数据结构和函数,被其他模块库调用
- Imagproc库: 图像处理库,包括图像滤波,几何变换,颜色空间转换,直方图
- Imgcodecs库: 图像文件的读取和写入
- Videoio库: 视频文件的抓取,读取和写入
- Highgui库: 高层图形用户界面,功能包括:创建和操作显示图像的窗口;为窗口界面提供键盘和鼠标操作的控件
- Video库: 视频分析库,包括背景提取,运动估计,物体跟踪算法
- Calib3d库: 相机配准和3D重构库,包括多维视角几何算法,立体对应算法,姿态估计,平面和立体配准,3D重构
- features2d: 2维特征框架库,包括特征检测,描述子,描述子匹配
- objdetect: 物体检测库,检测预先定义的物体,例如人脸,汽车,马路,猫,狗,桌子,瓶子邓等
- dnn: 深度神经网络库,创建一个新层的接口,从层构造和修改神经网络的接口,从不同的深度学习框架导入串型网络
- ml: 机器学习库,一组类和函数,用于分类,回归,聚类等等
- flann: 聚类和搜索库,实现快速邻居搜索
- shape: 外形距离计算和匹配库,根据外形实现匹配,检索和比较
- superres: 方案提升库,提升现有算法性能
- viz: 三维度可视库,实现与场景和组件的交互
- stitching: 图像缝补库,videostab: 视频稳定化库,photo: 计算摄影学库
图 1. OpenCV 2.0 的模块
OpenCV-Python 安装
在 Python 中使用 OpenCV 十分简单,只要安装 opencv-python 包即可,但因为安装包很大,预设是从 pypi 网站下载,所以先将安装镜像档先修改到国内,可以有效的降低安装时间。
# 设定镜像源:
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
# pip安装源的可信问题:
pip config set install.trusted-host pypi.tuna.tsinghua.edu.cn
# pip安装源的超时设置:
pip config set global.timeout 6000
# 安装 OpenCV-Python
pip install opencv-python
读取图像
imread(filename, flag=1)
读取图像。图像应该在工作目录或图像的完整路径应给出。第二个参数是一个标志,它指定了读取图像的方式。
- IMREAD_COLOR: 加载彩色图像。任何图像的透明度都会被忽视。它是默认标志。
- IMREAD_GRAYSCALE:以灰度模式加载图像。
- IMREAD_UNCHANGED:加载图像,包括alpha通道。
imshow(winname, mat)
显示图像,带两个参数,winname图像窗口名,mat图像矩阵。注意,在 jupyter 环境下,opencv 的 cv.imshow() 函数无法正常显示图片,所以用 plt.imshow() 函数替代。
waitkey(delay=0)
等待敲击键盘, delay为等待时间,毫秒,默认为0,表示一直等待,返回被敲的键的ASC编码;如果时间终止没有敲击,返回-1。
destroyWindow(winname)
销毁指定的窗口 winname,若没指定,则是销毁所有窗口。
参考源码 .py
import cv2
#加载彩色图像
img1 = cv2.imread('../data/gd.jpg',cv2.IMREAD_COLOR)
#加载灰度图像
img2 = cv2.imread('../data/gd.jpg',cv2.IMREAD_GRAYSCALE)
cv2.imshow('win1',img1)
cv2.imshow('win2',img2)
cv2.waitKey(0)
cv2.destroyWindow()
参考源码 .ipynb
from matplotlib import pyplot as plt
import cv2
#加载彩色图像
img1 = cv2.imread('../data/gd.jpg',cv2.IMREAD_COLOR)
img2 = cv2.imread('../data/gd.jpg',cv2.IMREAD_GRAYSCALE)
plt.figure(figsize=(8,12))
plt.subplot(211)
plt.imshow(img1)
plt.subplot(212)
plt.imshow(img2,plt.cm.gray)
plt.show()
图 2. OpenCV 读取图像
图像感兴趣区域ROI
有时候,我们不得不处理一些特定区域的图像。对于图像中的眼睛检测,首先对整个图像进行人脸检测。在获取人脸图像时,我们只选择人脸区域,搜索其中的眼睛,而不是搜索整个图像。它提高了准确性(因为眼睛总是在面部上和性能(因为我们搜索的区域很小)。使用 Numpy 索引再次获得 ROI(Region of Interest) 。我们选择球并将其复制到图像中的另一个区域:
参考源码
from matplotlib import pyplot as plt
import cv2
#加载彩色图像
img1 = cv2.imread('../data/messi.jpg',cv2.IMREAD_COLOR)
img1=cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)
#plt.figure(figsize=(12,8))
figure, plots = plt.subplots(ncols=3, nrows=1,figsize=(12,6))
plots[0].imshow(img1)
ball_ = img1[400:500, 450:550]
plots[1].imshow(ball_)
img1[400:500, 100:200] = ball_
plots[2].imshow(img1)
plt.show()
图 3. 复制感兴趣区域
参考资料
- OpenCV API, https://docs.opencv.org/
- matplotlib.pyplot.subplot, https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.subplot.html#matplotlib.pyplot.subplot
- matplotlib.pyplot.imshow, https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.imshow.html