一、OpenCV介绍
1.1、解释
OpenCV(全称:Open Source Computer Vision Library)是一个开源的计算机视觉库, 旨在通过计算机进行图像和视频处理。
1.2、特点
跨平台支持:OpenCV支持Windows、Linux、macOS等多个操作系统,可以与Python、C++、Java等多种编程语言结合使用。
丰富的功能:提供了大量函数和工具,涵盖图像处理、特征提取、机器学习、目标检测、图像分类等任务。
高性能:OpenCV经过高度优化,适用于大规模图像和视频数据处理,尤其在嵌入式系统和实时应用中表现突出。
1.3、主要功能
图像处理:包括图像的缩放、裁剪、旋转、颜色转换、平滑、边缘检测、直方图均衡化、二值化等操作。
特征检测和描述:OpenCV提供了诸如SIFT、SURF、ORB、FAST等算法,用于检测图像中的关键点,并提取其特征描述符。
目标检测和跟踪:可以实现Haar级联检测、人脸识别、行人检测以及物体跟踪等功能。
视频分析:包括运动检测、跟踪和分类等。
三维重建:通过多张2D图像,重建出3D模型,包括立体视觉和点云生成等功能。
图像分割:将图像分成若干个区域,每个区域都具有相似的属性,如颜色、纹理等。 机器学习与
深度学习: 提供机器学习算法(如SVM、KNN、神经网络等)接口,支持深度学习模型的加载和推理。
1.4、应用领域
自动驾驶:在自动驾驶中,OpenCV可用于道路检测、车辆检测、行人检测等任务。
医学影像处理:在医学领域,OpenCV可以用于医学影像处理,如医学图像分割、医学 图像配准、医学图像增强等。
安防领域:用于实现人脸识别、行人检测、异常行为检测等安防任务。
工业自动化:用于实现产品质量检测、生产线自动化等任务。
无人机技术:在无人机技术中,OpenCV可用于实现目标跟踪、地形识别等任务。
二、基本架构分析
2.1、核心模块
模块说明Core该模块包含 OpenCV 库的基础结构以及基本操作。Improve图像处理模块包含基本的图像转换,包括滤波以及类似的卷积操作。Highgui在 OpenCV 3.0中,分割为 imcodecs、videoio 以及 highgui 三部分。这个模块包含可以用来显示图像或者简单的输入的用户交互函数。这可以看作是一个非常轻量级的 Windows UI 工具包。Video该模块包含读取和写视频流的函数。Calib3d主要包含相机标定与立体视觉等功能,例如物体位姿估计、三维重建、摄像头标定等。Feature2d这个模块包含用于检测、描述以及匹配特征点的算法。特征检测算法包括 SIFT、SURF、ORB、FAST 等。Objectect这个模块包含检测特定目标,比如人脸或者行人的算法。也可以训练检测器并用来检测其他物体。MI机器学习模块本身是一个非常完备的模块,包含大量的机器学习算法实现并且这些算法都能和 OpenCV 的数据类型自然交互。
Opencv核心的所有模块:
opencv/modules at 4.x · opencv/opencv · GitHub
三、开发环境搭建
conda 查看安装源
conda config --show-sources
修改conda 默认安装源,请执行如下指令:
# 移除conda 默认安装源
conda config --remove channels defaults
# 安装清华安装源
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --set show_channel_urls yes
安装opencv
pip install opencv-python
官方地址:
OpenCV - Open Computer Vision Library
四、基本操作
4.1、图像读取
OpenCV用于读取图像的函数为:imread(),该函数支持、PNG、JPEG和TIFF等格式图像 文件。
cv.imread( filename[, flags] ) -> retval
cv.imread( filename[, dst[, flags]] ) -> dst
参数说明filename要加载的文件的名称。flags可以接受 cv::ImreadModes 值的标志
图像读取格式标志说明cv2.IMREAD_UNCHANGED按原样加载图像cv2.IMREAD_GRAYSCALE将图像转换为单通道灰度图像cv2.IMREAD_COLOR将图像转换为3通道BGR彩色图像cv2.IMREAD_ANYDEPTH当图像具有相应的深度时,返回16位或32位图像,否则将其深度转换为8位cv2.IMREAD_ANYCOLOR以任何可能的颜色格式读取图像cv2.IMREAD_LOAD_GDAL使用GDAL驱动程序加载图像cv2.IMREAD_REDUCED_GRAYSCALE_2将图像转换为单通道灰度图像,并且图像尺寸减小为1/2cv2.IMREAD_REDUCED_COLOR_2将图像转换为3通道BGR彩色图像,并且图像尺寸减小为1/2cv2.IMREAD_REDUCED_GRAYSCALE_4将图像转换为单通道灰度图像,并且图像尺寸减小为1/4cv2.IMREAD_REDUCED_COLOR_4将图像转换为3通道BGR彩色图像,并且图像尺寸减小为1/4cv2.IMREAD_REDUCED_GRAYSCALE_8将图像转换为单通道灰度图像,并且图像尺寸减小为1/8cv2.IMREAD_REDUCED_COLOR_8将图像转换为3通道BGR彩色图像,并且图像尺寸减小为1/8cv2.IMREAD_IGNORE_ORIENTATION不根据EXIF方向标志旋转图像
import cv2
img=cv2.imread('./images/pands.png',cv2.IMREAD_REDUCED_COLOR_4)
print(type(img))#输出数据类型
# print(img)#输出图像数组
print(img.shape)#输出数组形状(135, 136, 3)
print(img.dtype)#输出数组元素的数据类型uint8
print(img.size)#输出数组元素的个数55080 135*136*3
4.2、显示图像
在指定窗口中显示图像。
函数 imshow 在指定窗口中显示图像。如果窗口是使用 cv::WINDOW_AUTOSIZE 标志创建的,则图像将以其原始大小显示,但它仍受屏幕分辨率的限制。否则,将缩放图像以适合窗口。
cv.imshow( winname, mat ) -> None
函数描述winname窗口的名称mat要显示的图像。
注意
此函数后应调用 cv::waitKey 或 cv::p ollKey 来执行 GUI 内务处理任务,这些任务是实际显示给定图像并使窗口响应鼠标和键盘事件所必需的。否则,它不会显示图像,并且窗口可能会锁定。例如,waitKey(0) 将无限显示窗口,直到任意一个键(适合图像显示)。waitKey(25) 将显示一个帧,并等待大约 25 ms 的按键作(适用于逐帧显示视频)。要删除窗口,请使用 cv::d estroyWindow。
[仅限 Windows 后端]按 Ctrl+C 会将图像复制到剪贴板。按 Ctrl+S 将显示一个对话框以保存图像。
[仅限 Wayland 后端]支持格式已扩展。
如果图像是 8 位签名的,则像素将偏移 128。也就是说,值范围 [-128,127] 映射到 [0,255]。如果图像是 16 位签名的,则像素将除以 256 并偏移 128。也就是说,值范围 [-32768,32767] 映射到 [0,255]。
import cv2
img=cv2.imread('./images/pands.png',cv2.IMREAD_REDUCED_COLOR_2)
cv2.imshow('lena',img)
key = cv2.waitKey(0)
#显示图像
# 如果按下的键是'q',则退出程序
if (key == ord('q')): # ord('q')将字符'q'转换为对应的ASCII码
exit()
4.3、图像窗口操作
4.3.1、创建显示窗口
cv.namedWindow( winname[, flags] ) -> None
函数描述winname窗口的名称flags要显示的图像。
flags作用WINDOW_NORMAL显示图像后,允许用户随意调整窗口大小WINDOW_AUTOSIZE根据图像大小显示窗口,不允许用户调整大小WINDOW_FREERATIO窗口大小自适应比例WINDOW_KEEPRATIO保持图像的比例
import cv2
cv2.namedWindow("img",cv2.WINDOW_AUTOSIZE)
img = cv2.imread("./images/pands.png",cv2.IMREAD_COLOR )
cv2.imshow("img",img)
key = cv2.waitKey(0)
if key == ord('q'):
# 销毁窗口
cv2.destroyAllWindows()
4.3.2、窗口大小调整
cv.resizeWindow( winname, width, height ) -> None
cv.resizeWindow( winname, size ) -> None
函数描述winname窗口的名称size新的窗口大小。
window_name: 将显示图像/视频的窗口的名称
width:新窗口宽度(整数类型)
height: 新窗口高度(整数类型)
import cv2
img = cv2.imread("./images/pands.png",cv2.IMREAD_COLOR )
cv2.imshow("img",img)
cv2.namedWindow("img",cv2.WINDOW_AUTOSIZE)
cv2.resizeWindow("img",200,400)
key = cv2.waitKey(0)
if key == ord('q'):
# 销毁窗口
cv2.destroyAllWindows()
4.3.3、关闭窗口
cv.destroyAllWindows( ) -> None
您可以调用destroyWindow()或destroyAllWindows()来关闭窗口并取消分配任何 相关的内存使用。
4.3.4、等待键盘录入
函数 waitKey 无限等待 key 事件(当delay < 0)或 delay 毫秒数(当它为正数时)。由于作系统在切换线程之间有最短时间,因此该函数不会完全等待延迟毫秒,它至少会等待延迟毫秒,具体取决于当时计算机上正在运行的其他内容。它返回所按下的键的代码,如果在指定时间过去之前没有按下任何键则返回 -1。要检查是否按下了某个键但不等待它,请使用 polKey。
cv.waitKey([, delay]) ->retval
函数描述delay延迟(以毫秒为单位)。0 是表示 “永远” 的特殊值。
注意
函数 waitKey 和 pollKey 是 HighGUI 中唯一可以获取和处理 GUI 事件的方法,因此需要定期调用其中一个函数以进行正常的事件处理,除非在负责事件处理的环境中使用 HighGUI。
仅当至少创建了一个 HighGUI 窗口并且该窗口处于活动状态时,该功能才有效。如果有多个 HighGUI 窗口,则其中任何一个窗口都可以处于活动状态。