OpenCV 入门:基础图像操作
在计算机视觉领域,OpenCV 无疑是最受欢迎的开源库之一。它由 Intel 公司俄罗斯团队发起,如今已成为处理图像和视频的强大工具。本文我会介绍OpenCV 的基础知识,从图像的读写显示到实时视频流处理,迈出计算机视觉的第一步。
目录
OpenCV 为何值得学习?
图像的基本操作
读取、显示与保存图像
图像的像素操作
绘制几何图形
实时视频流处理
总结
OpenCV 为何值得学习?
OpenCV 之所以被广泛应用,得益于其三大优势:
首先是多语言支持,虽然基于 C++ 实现,但提供了 Python、Ruby、Matlab 等多种语言接口,其中 OpenCV-Python 结合了 C++ 的高性能和 Python 的简洁易读性。
其次是跨平台特性,可在 Windows、Linux、OS X、Android 和 iOS 等系统上运行,甚至支持基于 CUDA 和 OpenCL 的 GPU 加速。
最后是丰富的 API,涵盖了传统计算机视觉算法、主流机器学习算法,还添加了对深度学习的支持,满足各种视觉处理需求。
对于 Python 开发者来说,安装 OpenCV 非常简单,使用国内镜像源可快速完成:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python
图像的基本操作
读取、显示与保存图像
处理图像的第一步是掌握基本的 IO 操作。OpenCV 提供了简洁的接口完成这些任务:
import cv2import numpy as np# 读取图像(默认彩色模式)img = cv2.imread(\'image.jpg\')# 显示图像cv2.imshow(\"Image Window\", img)# 等待用户按键(0表示无限等待)cv2.waitKey(0)# 关闭所有窗口cv2.destroyAllWindows()# 保存图像cv2.imwrite(\"saved_image.jpg\", img)
需要注意的是,cv2.waitKey()
是显示图像不可或缺的部分,它给图像绘制留下时间,API里面填写的为多少毫秒,否则窗口可能无响应。
图像的像素操作
在计算机中,图像由像素组成。彩色图像通常由 RGB(红、绿、蓝)三个通道构成,每个通道的像素值范围是 0-255。在OpenCV中使用的BGR通道,我们可以直接操作像素值:
# 获取某个像素点的值(BGR格式,注意与RGB顺序不同)px = img[100, 100]print(px) # 输出 [B, G, R] 值# 修改像素值(设置为红色)img[100, 100] = [0, 0, 255]
绘制几何图形
OpenCV 提供了绘制各种几何图形的函数,方便我们在图像上添加标记:
# 绘制直线(起点、终点、蓝色、线宽2)cv2.line(img, (100, 100), (200, 200), (255, 0, 0), 2)# 绘制圆形(圆心、半径50、黄颜色、线宽2)cv2.circle(img, (300, 300), 50, (0, 255, 255), 2)# 绘制矩形(左上角、右下角、蓝色、线宽2)cv2.rectangle(img, (100, 200), (300, 300), (255, 0, 0), 2)# 添加文字(内容、位置、字体、大小、青蓝色、线宽4、抗锯齿)cv2.putText(img, \'Hello OpenCV\', (100, 200), cv2.FONT_ITALIC, 1, (255, 255, 0), 4, cv2.LINE_AA)
注意:在OpenCV中添加文字无法使用中文字符,会显示乱码,所以实际中常使用三大库中的matplotlib来实现添加中文字符。
实时视频流处理
除了静态图像,OpenCV 还能轻松处理实时视频流。通过电脑摄像头捕获视频的代码如下:
import cv2# 创建VideoCapture对象,参数0表示使用默认摄像头cap = cv2.VideoCapture(0)while True: # 读取一帧视频(ret为是否成功读取的标志,frame为帧数据) ret, frame = cap.read() # 如果读取失败则退出循环 if not ret: break # 在这里可以添加对帧的处理(如灰度化、绘制图形等) # 示例:转为灰度图 gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 显示处理后的帧 cv2.imshow(\'Camera Feed\', gray_frame) # 按\'q\'键退出循环 if cv2.waitKey(1) & 0xFF == ord(\'q\'): break# 释放摄像头资源并关闭所有窗口cap.release()cv2.destroyAllWindows()
这段代码的核心是VideoCapture
类,它负责从摄像头获取视频流。通过循环不断读取帧并处理,实现实时视频处理的效果。参数为0表示使用默认摄像头,也可以传入视频所在地址。
waitKey(1)
确保每帧之间有 1 毫秒的延迟,既保证视频流畅,又能检测按键输入。
总结
本文我介绍了 OpenCV 的基本操作,包括图像的读写显示、像素操作、几何图形绘制以及实时视频流处理。这些基础操作是进行更复杂计算机视觉任务的基石,例如目标检测、图像分割等。
OpenCV 的强大之处在于它将复杂的视觉算法封装成简单易用的接口,让开发者可以专注于业务逻辑而非底层实现。