图像处理基础
一、OpenCV主要功能及模块介绍
1、内置数据结构和输入/输出
- OpenCV内置了丰富的与图像处理有关的数据结构,如Image、Point、Rectangle等。
- core模块实现了各种基本的数据结构。
- imgcodecs模块提供了图像文件的读写功能,用户使用简单的命令即可读写图像文件。
2、图像处理操作
imgproc模块提供了图像处理操作,如图像过滤、几何图像变换、绘图、色彩空间转换、直方图等。
3、图形用户界面操作
highgui模块提供了图像的图形窗口操作功能,如创建窗口显示图像或者视频、令窗口响应键盘和鼠标事件、操作窗口中图像的某个区域等。
4、视频分析
video模块提供了视频分析功能,如分析视频中连续帧之间的运动、跟踪视频中的目标。videostab模块提供了视频稳定处理功能,可解决拍摄视频时的抖动问题。optflow模块提供了与光流操作相关的算法。
5、3D重建
calib3d模块提供了3D重建功能,可根据2D图像创建3D场景。
6、特征提取
features2d模块提供了特征提取功能,可以从2D图像中检测和提取对象的特征。
7、对象检测
objdetect和xobjdetect模块提供了对象检测功能,可在图像中检测给定图像的位置。
8、机器学习
ml模块提供了机器学习功能,包含了多种机器学习算法,如k近邻(k-Nearest Neighbors,kNN)、k均值聚类(k-Means Clustering)、支持向量机(Support Vector Machines,SVM)、神经网络(Neural Network)等。机器学习算法广泛应用于目标识别、图像分类、人脸检测、视觉搜索等。
9、深度学习
深度神经网络(Deep Neural Network,DNN)模块提供了深度学习功能。深度学习是机器学习中近几年来快速发展的一个子领域,广泛应用于语音识别、图像识别、自然语言处理、图像修复、人脸识别等。OpenCV的深度学习支持Caffe、TensorFlow、Torch、Darknet等著名的深度学习框架。
10、计算摄影
计算摄影通过图像处理技术来改善相机拍摄的图像,如高动态范围成像、全景图像、图像补光等。photo和xphoto模块提供了与计算摄影有关的算法,stitching模块提供了全景图像算法。
11、形态分析
shape模块提供了形态分析功能,可以识别图像中对象的形状、分析形状之间的相似性、转换对象形状等。
12、人脸检测和识别
OpenCV已在face模块中实现了人脸检测、人脸特征检测和人脸识别功能。人脸检测属于对象检测,用于找出图像中人脸的位置和尺寸。人脸特征检测属于特征检测,用于找出图像中人脸的主要特征。人脸识别属于对象识别,包括从已知人脸集合中找出与未知人脸最匹配的人脸,以及验证给定人脸是否为某个已知人脸。OpenCV实现了基于Haar级联分类器和基于深度学习的人脸检测算法,以及EigenFaces、FisherFaces和局部二进制编码直方图(Local Binary Patterns Histograms,LBPH)等人脸识别算法。
13、表面匹配
surface_matching模块提供了3D对象识别算法和3D特征的姿态估计算法,用于根据图像的深度和强度信息识别3D对象。
14、文本检测和识别
text模块提供了文本检测和识别功能,用于识别和检测图像中的文本,实现车牌识别、道路标志识别、内容数字化等相关应用。
二、图像基本操作
读取图像:cv.imread()
python">import numpy as np
import cv2 as cv
#加载彩色灰度图像
img = cv.imread('messi5.jpg',0)
显示图像:cv.imshow()
python">cv.imshow('image',img)
cv.waitKey(0)
cv.destroyAllWindows()
写入图像:cv.imwrite()
python">import cv2
import numpy
img=numpy.zeros((50,50),dtype=numpy.uint8) #创建大小为50×50的黑色正方形图像
cv2.imwrite('messigray.jpg',img)
思考题:如果我们想以灰度模式加载图像,显示图像,按s键可以保存图像并退出,或者按ESC键直接退出不保存,设计出代码。
python">import numpy as np
import cv2 as cv
img = cv.imread('cat.jpg',0) #或者把0改成cv.IMREAD_GRAYSCALE
cv.imshow('cat.jpg',img)
k=cv.waitKey(0)
if k==27:
cv.destroyAllWindows()
elif k==ord('s'):
cv.imwrite('catgray.png',img)
cv.destroyAllWindows()
其中注意:
- 判断 ESC 键(ASCII码27):
如果按下的是 ESC 键(对应的ASCII码是27),程序会调用cv.destroyAllWindows()
关闭所有打开的窗口,不保存图像。 - 判断 s 键:
如果按下的是字母s
键(ord('s')
用来获取字符s
的 ASCII 码),程序会执行两步:- 使用
cv.imwrite('catgray.png', img)
将当前图像保存为名为'catgray.png'
的文件。 - 然后调用
cv.destroyAllWindows()
关闭所有窗口。
- 使用
三、视频读取-摄像头读取
(1)将视频文件或者摄像头作为数据源来创建VideoCapture对象。
(2)调用VideoCapture对象的read()方法获取视频中的帧,每一帧都是一幅图像。
(3)调用VideoWriter对象的write()方法将帧写入视频文件,或者调用cv2.imshow()函数在窗口中显示帧(即播放视频)。
python">import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
fourcc = cv.VideoWriter_fourcc(*'XVID')
out = cv.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
if not cap.isOpened():
print("Cannot open camera")
exit()
while True:
# 逐帧捕获
ret, frame = cap.read()
# 如果正确读取帧,ret为True
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
frame = cv.flip(frame, 1)
out.write(frame)
# 我们在框架上的操作到这里
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
# 显示结果帧e
cv.imshow('frame', frame)
if cv.waitKey(1) == ord('q'):
break
# 完成所有操作后,释放捕获器
cap.release()
out.release()
cv.destroyAllWindows()
- 通过摄像头实时捕获视频;
- 对每一帧进行水平镜像翻转;
- 将处理后的帧保存为视频文件,同时在屏幕上实时显示视频画面;
- 当用户按下
'q'
键时,停止视频捕获并释放所有资源。
像这样,还挺有趣的哈哈
后面可以结合图像识别做更有趣的操作,学起来~