零基础学习OpenCV Python – wiki基地

零基础学习OpenCV Python:从入门到实践

欢迎来到计算机视觉的奇妙世界!如果你对图像处理、模式识别、人工智能充满好奇,那么OpenCV Python绝对是你的绝佳起点。本指南将带你从零开始,逐步掌握OpenCV Python的基础知识和核心应用。

什么是OpenCV?

OpenCV (Open Source Computer Vision Library) 是一个开源的计算机视觉和机器学习软件库。它包含了2500多种优化的算法,可用于实时图像处理、人脸识别、物体检测、图像拼接等多种计算机视觉任务。最初用C++编写,但现在提供了Python、Java等多种语言接口,其中Python因其简洁的语法和丰富的科学计算库而成为OpenCV最受欢迎的接口之一。

为什么选择Python?

  • 易学易用: Python语法简单,非常适合初学者。
  • 丰富的库生态: Python拥有NumPy(用于数值计算)、Matplotlib(用于数据可视化)等强大的库,与OpenCV结合使用时如虎添翼。
  • 快速原型开发: Python可以帮助你快速实现想法,进行实验和原型开发。
  • 社区活跃: 庞大的社区提供了丰富的资源和支持。

准备环境:搭建你的视觉实验室

在开始之前,我们需要搭建一个合适的开发环境。

1. 安装Python

推荐使用Anaconda或Miniconda,它们能帮助你管理Python版本和包依赖,避免环境冲突。

安装完成后,打开Anaconda Prompt (或终端),你可以创建一个新的虚拟环境:

bash
conda create -n opencv_env python=3.9
conda activate opencv_env

2. 安装OpenCV

激活虚拟环境后,使用pip安装opencv-python

bash
pip install opencv-python numpy matplotlib

  • opencv-python: OpenCV的核心库。
  • numpy: OpenCV图像数据主要以NumPy数组形式存储和处理。
  • matplotlib: 用于显示图像和绘图,方便调试和结果展示。

3. 选择一个集成开发环境 (IDE)

  • VS Code (Visual Studio Code): 轻量级、功能强大,拥有丰富的插件生态系统。
  • PyCharm: 专业的Python IDE,功能全面,适合大型项目开发。

图像处理基础:你的第一张图片

1. 读取、显示和保存图像

图像在OpenCV中被表示为NumPy数组,通常是多维数组(高度 x 宽度 x 通道数)。

“`python
import cv2
import matplotlib.pyplot as plt

读取图像

注意:cv2.imread() 默认以 BGR (蓝绿红) 格式读取图像

img = cv2.imread(‘example.jpg’) # 替换为你的图片路径

if img is None:
print(“Error: Could not read image.”)
else:
# 显示图像
# cv2.imshow(‘Image Title’, img)
# cv2.waitKey(0) # 等待按键
# cv2.destroyAllWindows() # 销毁所有窗口

# 使用 Matplotlib 显示 (推荐,因为它使用 RGB 格式,更符合人类视觉习惯)
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 将 BGR 转换为 RGB
plt.imshow(img_rgb)
plt.title('My First Image')
plt.axis('off') # 不显示坐标轴
plt.show()

# 保存图像
cv2.imwrite('new_example.png', img)
print("Image saved as new_example.png")

“`

2. 图像基本属性

你可以像操作NumPy数组一样获取图像的属性:

python
print("图像形状 (高, 宽, 通道数):", img.shape)
print("图像总像素数:", img.size)
print("图像数据类型:", img.dtype)

3. 灰度图像和颜色空间转换

将彩色图像转换为灰度图像是常见的预处理步骤。

“`python
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

plt.imshow(gray_img, cmap=’gray’) # 灰度图需要指定 cmap=’gray’
plt.title(‘Grayscale Image’)
plt.axis(‘off’)
plt.show()
“`

OpenCV支持多种颜色空间转换,例如BGR到HSV(色相、饱和度、亮度),在某些应用(如颜色分割)中非常有用。

“`python
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

可以单独查看 HSV 的通道,例如:

plt.imshow(hsv_img[:,:,0], cmap=’hsv’) # HUE通道

plt.show()

“`

4. 图像裁剪、缩放和旋转

“`python

裁剪:[y1:y2, x1:x2]

cropped_img = img[100:300, 50:250] # 裁剪从 (50,100) 到 (250,300) 的区域

缩放

INTER_AREA 适用于缩小,INTER_CUBIC 或 INTER_LINEAR 适用于放大

resized_img = cv2.resize(img, (200, 300), interpolation=cv2.INTER_AREA)

旋转

(h, w) = img.shape[:2]
center = (w // 2, h // 2)

旋转矩阵 (中心点, 旋转角度, 缩放比例)

M = cv2.getRotationMatrix2D(center, 45, 1.0) # 旋转45度,不缩放
rotated_img = cv2.warpAffine(img, M, (w, h))

显示这些结果… (略)

“`

OpenCV核心功能:探索图像的奥秘

1. 在图像上绘制图形和文本

“`python

创建一个黑色图像作为画布

canvas = np.zeros((500, 500, 3), dtype=np.uint8)

绘制线条 (图像, 起点, 终点, 颜色(BGR), 线条宽度)

cv2.line(canvas, (0, 0), (500, 500), (0, 255, 0), 5) # 绿色对角线

绘制矩形 (图像, 左上角, 右下角, 颜色, 线条宽度 / -1 填充)

cv2.rectangle(canvas, (100, 100), (400, 300), (255, 0, 0), -1) # 蓝色填充矩形

绘制圆形 (图像, 中心点, 半径, 颜色, 线条宽度 / -1 填充)

cv2.circle(canvas, (250, 250), 100, (0, 0, 255), 3) # 红色圆圈

添加文本 (图像, 文本内容, 起点, 字体, 字号, 颜色, 粗细, 线条类型)

font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(canvas, ‘Hello OpenCV’, (10, 450), font, 1, (255, 255, 255), 2, cv2.LINE_AA)

plt.imshow(cv2.cvtColor(canvas, cv2.COLOR_BGR2RGB))
plt.title(‘Drawing on Canvas’)
plt.axis(‘off’)
plt.show()
“`

2. 图像算术和位操作

你可以对图像进行加减乘除等操作,或者进行位操作(AND, OR, NOT, XOR)。

“`python

图像加法 (cv2.add 饱和操作,np.add 模操作)

这通常用于图像叠加或亮度调整

img1 = cv2.imread(‘image1.jpg’)
img2 = cv2.imread(‘image2.jpg’)

确保两张图片大小相同

img2 = cv2.resize(img2, (img1.shape[1], img1.shape[0]))

added_img = cv2.add(img1, img2) # 对应像素值相加,最大不超过255

位操作:掩膜 (Masking)

例如,你想把一个图像的一部分叠加到另一个图像上

mask = np.zeros(img1.shape[:2], dtype=”uint8″)

cv2.circle(mask, (img1.shape[1] // 2, img1.shape[0] // 2), 100, 255, -1)

masked_img = cv2.bitwise_and(img1, img1, mask=mask)

“`

3. 阈值处理

阈值处理是将图像分割成不同区域(通常是前景和背景)的简单而有效的方法。

“`python
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

cv2.threshold(src, thresh, maxval, type)

type: cv2.THRESH_BINARY, cv2.THRESH_BINARY_INV, cv2.THRESH_TRUNC, cv2.THRESH_TOZERO, cv2.THRESH_TOZERO_INV

ret, thresh1 = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # 简单二值化
ret, thresh2 = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV) # 反向二值化

自适应阈值:对光照不均的图像更有效

cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)

adaptiveMethod: cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.ADAPTIVE_THRESH_MEAN_C

thresh_adaptive = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
“`

4. 图像平滑和模糊

模糊操作可以帮助去除图像中的噪声。

“`python

均值模糊

blurred_avg = cv2.blur(img, (5, 5)) # 核大小 5×5

高斯模糊 (更常用,效果更好)

blurred_gaussian = cv2.GaussianBlur(img, (5, 5), 0)

中值模糊 (对椒盐噪声效果好)

blurred_median = cv2.medianBlur(img, 5)
“`

5. 边缘检测

边缘检测是图像处理中的一个重要环节,Canny算法是其中最著名和最有效的之一。

python
edges = cv2.Canny(gray, 100, 200) # 100和200是低阈值和高阈值
plt.imshow(edges, cmap='gray')
plt.title('Canny Edges')
plt.axis('off')
plt.show()

视频处理:让图像动起来

OpenCV不仅能处理静态图像,还能轻松处理视频流,无论是来自摄像头还是视频文件。

“`python

打开摄像头

cap = cv2.VideoCapture(0) # 0代表默认摄像头,也可以是视频文件路径 ‘video.mp4’

if not cap.isOpened():
print(“Error: Could not open video stream or file.”)
else:
while True:
ret, frame = cap.read() # 读取一帧

    if not ret:
        print("Can't receive frame (stream end?). Exiting ...")
        break

    # 对每一帧进行处理 (例如转换为灰度)
    gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    cv2.imshow('Live Feed', frame)
    cv2.imshow('Gray Feed', gray_frame)

    # 按 'q' 退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release() # 释放摄像头
cv2.destroyAllWindows()

“`

保存视频

“`python

定义编码器和创建 VideoWriter 对象

fourcc = cv2.VideoWriter_fourcc(*’XVID’) # .avi 格式

out = cv2.VideoWriter(‘output.avi’, fourcc, 20.0, (640, 480)) # 帧率 20, 分辨率 640×480

在循环中写入帧

out.write(frame)

循环结束后释放

out.release()

“`

更进一步:探索高级话题

当你掌握了上述基础知识后,可以尝试深入以下领域:

  • 轮廓检测 (Contours): 用于形状分析、物体识别。
  • 直方图 (Histograms): 分析图像的像素强度分布。
  • 形态学操作 (Morphological Operations): 腐蚀、膨胀、开闭运算,用于图像预处理和特征提取。
  • 特征检测与描述 (Feature Detection and Description): SIFT, SURF, ORB等,用于图像匹配、物体识别。
  • 物体检测 (Object Detection): 基于Haar Cascade的人脸检测,或更现代的深度学习方法(如YOLO, SSD)。
  • 图像拼接 (Image Stitching): 创建全景图像。
  • 机器学习与深度学习集成: 将OpenCV与Scikit-learn、TensorFlow、PyTorch等结合,构建更智能的视觉应用。

总结

本指南带你踏入了OpenCV Python的殿堂,从环境搭建到图像和视频处理的基础操作,你已经具备了构建简单计算机视觉应用的能力。计算机视觉是一个广阔而激动人心的领域,它将数字世界与现实世界连接起来。

持续学习和实践是掌握任何新技能的关键。通过阅读OpenCV官方文档、在线教程和参与开源项目,你将不断提升自己的技能。现在,是时候开始你自己的视觉项目了,用你的创意点亮代码!

滚动至顶部