2.0OpenCV
计算机视觉(Computer Vision)是人工智能的一个重要分支,它研究如何让计算机“看”和“理解”图像和视频。也叫机器视觉(Machine Vision)。
除了纯视觉方向外,还有有很多令人兴奋的混合方向!
混合方向 | 应用场景 | 核心技术 | 典型案例 |
---|---|---|---|
视觉 + 自然语言处理 | 图像描述生成、视觉问答、多模态搜索 | Vision Transformer、CLIP、GPT-4V、LLaVA | ChatGPT视觉功能、Google Lens、图片搜索 |
视觉 + 运动控制 | 自动驾驶、机器人导航、无人机飞行控制 | SLAM、视觉里程计、路径规划 | 特斯拉FSD、波士顿动力机器人、大疆无人机 |
视觉 + 生物医学 | 疾病诊断、手术导航、药物发现 | CT/MRI图像分析、病理切片分析、三维重建 | 肺结节检测、皮肤癌诊断、眼底病变分析 |
视觉 + 三维重建 | 建筑建模、文物保护、虚拟旅游 | 立体视觉、结构光、NeRF、3D Gaussian Splatting | iPhone激光雷达、Matterport 3D扫描 |
早在深度学习之前,人们就开始探索图像的处理了,OpenCV 诞生于深度学习之前,是功能最全面的开源库。它提供了从最基础的图像读写、处理到复杂的特征匹配、目标跟踪、校准等一系列工具。其核心优势在于传统的计算机视觉算法,如图像处理、滤波、形态学操作等。
它向前承接传统以数组为单位的图像处理,向后允许你加载一些现成的算法、模型,是传统图像处理与深度学习之间重要的桥梁。
安装
opencv(opensource computer vision)开源计算机视觉库,包含大量的图像处理函数。
opencv-python需要根据环境选择正确的包
有4个不同的包,你只能选择其中的一个。不要在同一环境中安装多个不同的包。
所有包都使用相同的名称空间(cv2
)。如果你在同一环境中安装了多个不同的包,请使用 pip uninstall
卸载所有包,然后只重新安装一个包。
a. 针对标准桌面环境的包(适用于 Windows、macOS、几乎所有 GNU/Linux 发行版)
- 选项 1 - 主模块包:
pip install opencv-python
- 选项 2 - 完整包(包含主模块和 contrib/extra 模块):
pip install opencv-contrib-python
(请参考 OpenCV 文档 中的 contrib/extra 模块列表)
b. 针对服务器(无窗口)环境的包(例如 Docker、云环境等),无 GUI 库依赖
这些包比前面两种包更小,因为它们不包含任何图形用户界面功能(未编译 Qt 或其他 GUI 组件)。这意味着这些包避免了对 X11 库的庞大依赖,从而例如可以生成更小的 Docker 镜像。如果你不使用 cv2.imshow
等函数,或者你使用其他包(例如 PyQt)来构建界面而非 OpenCV,则应始终使用这些包。
- 选项 3 - 无窗口主模块包:
pip install opencv-python-headless
- 选项 4 - 无窗口完整包(包含主模块和 contrib/extra 模块):
pip install opencv-contrib-python-headless
(请参考 OpenCV 文档 中的 contrib/extra 模块列表)
OpenCv作为开源软件,自然有大量的教程,我读过一些纸质书籍,也看过一些开源教程,总体来说,对于入门与进阶来说,需要的是细致的基础讲解、完整的处理流程,非常推荐官方的OpenCV-Python教程。
图像读取与显示
图像读取
函数签名:cv2.imread(filename, flags=cv2.IMREAD_COLOR) -> image
参数说明:
filename
:要读取的文件名flags
:读取标志,默认值为cv2.IMREAD_COLOR,表示读取为BGR格式。可选参数:- cv2.IMREAD_COLOR:读取为BGR格式,默认值。对应数值为1。
- cv2.IMREAD_GRAYSCALE:读取为灰度图,对应数值为0。
- cv2.IMREAD_UNCHANGED:读取为原图,包含alpha通道,对应数值为-1。
返回值:
- 返回读取的图像对象, 如果读取失败, 不报错,返回None
-
CV2默认使用系统编码,如果文件路径含中文无法正常读取,需要把系统编码改为
utf-8
。
图像对象的常用属性:
shape
:图像的形状,(height, width, channels) 其中channels为3、4,表示通道数为RGB、RGBA(A是透明度),如果是灰度、二值图,通道数为1的情况会只返回(height, width)。size
:图像的像素数,height * width * channelsdtype
:图像的数据类型ndim
:图像的维度itemsize
:图像的元素大小nbytes
:图像的内存大小
import cv2
path= "10.jpg"
img = cv2.imread(path)
print(img.shape)
图像保存
函数签名:cv2.imwrite(filename, img, [params])
参数说明:
filename
:要保存的文件名img
:要保存的图像对象(数据)params
:可选参数,用于指定保存的格式和质量,可选参数:- cv2.IMWRITE_JPEG_QUALITY:JPEG图像质量,范围为0-100,默认值为95
- cv2.IMWRITE_PNG_COMPRESSION:PNG图像压缩级别,范围为0-9,默认值为3
- cv2.IMWRITE_PXM_BINARY:PPM/PGM/PBM图像格式,默认值为False
import cv2
path= "10.jpg"
img = cv2.imread(path)
cv2.imwrite('new_img.jpg',img, [cv2.IMWRITE_JPEG_QUALITY, 100])