在计算机视觉领域,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 cv2
import 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 的强大之处在于它将复杂的视觉算法封装成简单易用的接口,让开发者可以专注于业务逻辑而非底层实现。