1. Opencv简介
入门前可以稍稍了解一些关于OpenCV的介绍,以下做简略介绍:
OpenCV 的主要功能:
- 图像处理:包括图像变换(如缩放、旋转、仿射变换)、图像滤波(如平滑、锐化、边缘检测)、图像阈值处理等。
- 视频分析:读取、显示视频文件,视频帧处理,视频流处理等。
- 特征检测与匹配:检测图像中的关键点(如角点、边缘等),并用于图像匹配、目标识别等。
- 对象检测:使用预训练的模型检测图像中的特定对象(如人脸、车辆等)。
- 面部识别:利用面部特征进行身份认证或表情分析等。
- 3D重建:从多视角图像或视频中重建三维场景。
- 机器学习:OpenCV 包含了一些基本的机器学习算法,可用于图像分类、聚类等任务。
OpenCV 的官方文档:
官方网站: OpenCV - Open Computer Vision Library
文档页面: OpenCV-Python Tutorials
GitHub仓库:OpenCV GitHub Repository
1.1 图像相关概念
1.1.1 位数
计算机采用0/1编码的系统,数字图像也是利用0/1来记录信息。我们常接触的图像都是8位数图像,包含0~255灰度,其中0,表示最黑,1,表示最白。
8位图像:每个像素可以显示256种颜色的图像。这种图像通常被称为标准清晰度图像,广泛应用于电视和计算机屏幕上。8位图像可以显示的颜色数量为2e8 = 256种颜色(灰度图),对于彩色图像,如果每个颜色通道(红、绿、蓝)都是8位,则总颜色数为2563 = 16,777,216种颜色,这种图像也被称为24位图像或真彩色图像。
1.1.2 二值图
二值图是一种简洁的图像表示方式,它仅包含黑色和白色两种颜色,每个像素点非黑即白,没有中间灰度值。这种图像形式因其数据量小、处理方便且边缘清晰的特点,在图像分割、字符识别、计算机视觉等领域得到广泛应用。
1.1.3 灰度图
灰度图是一种图像表示方式,其中图像中的每个像素点具有不同的灰度级别,这些级别通常是从黑色(灰度值为0)到白色(灰度值为255)之间的连续变化。灰度图不包含颜色信息,只展示图像的亮度变化,因此在处理和分析图像时,能够更专注于图像的纹理、形状等特征。
1.1.4 彩色图
彩色图像是一种包含丰富色彩信息的图像表示方式。它不仅能够展现图像的亮度信息,还能通过红、绿、蓝(RGB,分量介于0~255)三种基色的不同组合来精确地表示出成千上万种颜色。彩色图像中的每个像素点都对应着这三个颜色通道上的具体数值,这些数值共同决定了该像素点的颜色。彩色图像因其色彩丰富、细节表现力强,被广泛应用于数字摄影、电影制作、广告设计、医学成像等多个领域,为人们提供了更加真实、生动的视觉体验。
1.2 OpenCV安装
可以参考这篇文章:Pycharm安装Opencv详细教程
1.3 OpenCV模块
OpenCV具有多个功能模块,包括深度神经网络模块(dnn)、机器学习模块(ML)、视频分析模块(Video)、快速近似最近邻库(Flann)、照片模块(Photo)、图像拼接模块(Stitching)、形状模块(Shape)、超分辨率模块(Superres)、视频稳定模块(Videstab)、3D可视化模块(Viz)、图像编解码模块(Imgcodecs)、对象检测模块(ObjDetect)、相机标定与三维重建模块(Calib3D)、核心模块(Core)、图像处理模块(Imgproc)、高GUI模块(Highgui)、特征检测与匹配模块(Features2D)等,其中标红部分为主要学习模块,简介如下:
- 核心模块(Core)
该模块是其他模块的基础,提供了基本的核心功能、数据结构和函数。它包括了基本的数据类型、动态数据结构、数学函数、数组操作等。
- 图像处理模块(Imgproc)
专门用于图像处理,包括色彩空间转换、几何变换(如缩放、旋转、仿射变换)、图像滤波(如平滑、锐化、边缘检测)、直方图操作等。
- 高GUI模块(Highgui)
用于创建和操作图形用户界面元素,如显示图像的窗口、处理键盘和鼠标事件等。不过,在新版本的OpenCV中,Highgui的功能可能已被其他模块(如imgcodecs和videoio)所取代。
- 特征检测与匹配模块(Features2D)
包括特征检测器(如SIFT、SURF、ORB等)和描述符提取器,用于在图像中检测关键点并提取其描述符,进而进行特征匹配和图像配准。
2 OpenCV基本操作
2.1 基本操作
2.1.1 图像读取、显示、保存
- 图像读取:cv2.imread()
import cv2
# 使用cv2.imread()读取图像
# 参数1: 图像文件的路径
# 参数2: 读取模式
# cv2.IMREAD_COLOR: 加载彩色图像,任何图像的透明度都会被忽略(默认)
# cv2.IMREAD_GRAYSCALE: 以灰度模式加载图像
# cv2.IMREAD_UNCHANGED: 包括alpha通道的加载图像
image = cv2.imread('path_to_your_image.jpg', cv2.IMREAD_COLOR)
# 检查图像是否成功加载
if image is not None:
# 在这里处理图像
# 例如,显示图像
cv2.imshow('Loaded Image', image)
# 等待按键操作
cv2.waitKey(0)
# 关闭所有OpenCV窗口
cv2.destroyAllWindows()
else:
print("Error: Image could not be read.")
注:图像路径中不得存在中文,否则会出现cv2.error: OpenCV(4.10.0) D:\a\opencv-python\opencv-python\opencv\modules\highgui\src\window.cpp:973: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'cv::imshow'错误。
注:opencv图像读取通道为B\G\R,matplotlib图像读取通道为R\G\B
- 显示图像:cv2.imshow()
# 显示图像,'Image Window'是窗口名称,image是要显示的图像
cv2.imshow('Image Window', image)
# 等待按键事件,参数为等待时间(毫秒),0表示无限期等待,按任意键结束
cv2.waitKey(0)
# 关闭所有OpenCV创建的窗口
cv2.destroyAllWindows()
- 保存图像 :cv2.imwrite()
import cv2
# 读取图像
image = cv2.imread('input.jpg')
# 检查图像是否正确读取
if image is None:
print("Error: 图像未能正确读取")
else:
# 保存图像
is_saved = cv2.imwrite('output.png', image)
# 检查图像是否保存成功
if is_saved:
print("图像已保存")
else:
print("Error: 图像未能保存")
注:保存图像路径设置最好不要有中文!!!
2.1.2 图像上绘制几何图形
- 绘制直线:使用
cv2.line()
函数来绘制线条。你需要指定线条的起点和终点坐标,以及线条的颜色和粗细。
import cv2
import numpy as np
# 创建一个黑色的空白图像
img = np.zeros((512,512,3), np.uint8)
# 绘制一条对角线
cv2.line(img,(0,0),(511,511),(255,0,0),5)
# 显示图像
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 绘制矩形:使用
cv2.rectangle()
函数来绘制矩形。你需要指定矩形的左上角和右下角坐标,以及颜色和线条粗细(或者如果填充的话,使用-1
作为线条粗细)。
import cv2
import numpy as np
# 创建一个黑色的空白图像
img = np.zeros((512,512,3), np.uint8)
# 绘制一个蓝色的矩形
cv2.rectangle(img,(384,0),(510,128),(255,0,0),3)
# 绘制一个填充的矩形
cv2.rectangle(img,(0,384),(128,510),(0,255,0),-1)
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 绘制圆形:使用
cv2.circle()
函数来绘制圆形。你需要指定圆心的坐标、半径、颜色以及线条粗细(或者如果填充的话,使用-1
)。
import cv2
import numpy as np
# 创建一个黑色的空白图像
img = np.zeros((512,512,3), np.uint8)
# 绘制一个绿色的圆
cv2.circle(img,(447,63), 63, (0,255,0), -1)
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 绘制多边形:对于多边形,你可以使用