使用OpenCV和Python:入门指南 – wiki大全

使用OpenCV和Python:入门指南

OpenCV(Open Source Computer Vision Library)是一个强大的开源计算机视觉和机器学习软件库。它广泛应用于各种领域,包括图像处理、视频分析、面部识别、对象检测等。结合Python,OpenCV成为了一个极其灵活和易用的工具,无论是对于初学者还是经验丰富的开发者,都能快速构建出复杂的计算机视觉应用。

本指南将带你从零开始,逐步了解如何安装OpenCV-Python,并掌握一些基本的图像和视频处理操作。

1. 为什么选择OpenCV和Python?

  • 开源免费:OpenCV是免费使用的,拥有庞大的社区支持。
  • 功能丰富:涵盖了计算机视觉领域的大部分常用算法,从基础的图像操作到高级的深度学习模型推理。
  • 高性能:虽然Python是解释型语言,但OpenCV的底层核心是用C++实现的,并通过Python绑定提供了高效的性能。
  • 易学易用:Python简洁的语法和丰富的生态系统使得OpenCV的使用变得非常直观。

2. 环境搭建:安装OpenCV-Python

在开始之前,你需要确保你的系统上已经安装了Python和pip(Python包管理器)。

最简单的安装方式是使用pip:

bash
pip install opencv-python

如果你需要额外的贡献模块(例如一些非免费或专利算法),可以安装 opencv-contrib-python

bash
pip install opencv-contrib-python

注意:通常情况下,opencv-python 已经足够满足大部分需求。不要同时安装这两个包,选择其中一个即可。

3. 图像基础:读取、显示与保存

让我们从最基本的图像操作开始。

“`python
import cv2
import sys

1. 读取图像

确保 ‘image.jpg’ 在你的脚本所在目录,或者提供完整路径

try:
img = cv2.imread(‘image.jpg’)
except Exception as e:
print(f”Error reading image: {e}”)
sys.exit()

if img is None:
print(“Error: Could not open or find the image.”)
sys.exit()

2. 显示图像

‘Original Image’ 是窗口的名称

cv2.imshow(‘Original Image’, img)

3. 等待按键

0 表示无限期等待,任何正整数表示等待的毫秒数

cv2.waitKey(0)

4. 关闭所有OpenCV窗口

cv2.destroyAllWindows()

5. 保存图像

将图像保存为 ‘new_image.png’

cv2.imwrite(‘new_image.png’, img)

print(“图像读取、显示和保存完成。”)
“`

解释:

  • cv2.imread(filepath, flag): 用于加载图像。filepath 是图像的路径。flag 参数(可选)指定读取图像的方式(如 cv2.IMREAD_COLOR 用于彩色图像,cv2.IMREAD_GRAYSCALE 用于灰度图像)。默认是彩色。
  • cv2.imshow(winname, mat): 在指定的窗口中显示图像。winname 是窗口的名称,mat 是要显示的图像(NumPy数组)。
  • cv2.waitKey(delay): 等待键盘事件。delay 单位是毫秒。如果 delay 为 0,则无限期等待直到有按键按下。它返回按键的ASCII码。
  • cv2.destroyAllWindows(): 销毁所有创建的OpenCV窗口。
  • cv2.imwrite(filepath, img): 将图像保存到指定路径。

在OpenCV中,图像被视为Numpy数组。这意味着你可以使用Numpy的强大功能来处理图像数据。例如,彩色图像通常是三维数组 [height, width, channels],其中通道通常是BGR(蓝色、绿色、红色)顺序,而不是RGB。

4. 图像基本操作

4.1 灰度转换

将彩色图像转换为灰度图像是常见的操作。

“`python
import cv2

img = cv2.imread(‘image.jpg’)
if img is None:
print(“Error: Could not open or find the image.”)
exit()

将图像转换为灰度

gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

cv2.imshow(‘Original Image’, img)
cv2.imshow(‘Grayscale Image’, gray_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
“`

cv2.cvtColor() 用于改变图像的颜色空间。cv2.COLOR_BGR2GRAY 是一个颜色空间转换码,表示将BGR格式转换为灰度格式。

4.2 调整大小 (Resizing)

你可以根据需要改变图像的尺寸。

“`python
import cv2

img = cv2.imread(‘image.jpg’)
if img is None:
print(“Error: Could not open or find the image.”)
exit()

将图像缩小到宽度100像素,高度按比例缩放

resized_img = cv2.resize(img, (100, int(img.shape[0] * (100 / img.shape[1]))))

或者指定固定的宽度和高度

resized_img_fixed = cv2.resize(img, (200, 300)) # 宽度200,高度300

cv2.imshow(‘Original Image’, img)
cv2.imshow(‘Resized Image’, resized_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
“`

cv2.resize(src, dsize, fx, fy, interpolation): src 是源图像,dsize 是输出图像的大小 (width, height)。你也可以通过 fxfy 指定沿x轴和y轴的比例因子。interpolation 参数指定插值方法,例如 cv2.INTER_AREA (缩小图像时常用) 或 cv2.INTER_LINEAR (默认,放大时常用)。

4.3 裁剪 (Cropping)

由于图像是Numpy数组,你可以直接使用Numpy的切片功能进行裁剪。

“`python
import cv2

img = cv2.imread(‘image.jpg’)
if img is None:
print(“Error: Could not open or find the image.”)
exit()

裁剪图像:从行 50 到 200,从列 100 到 300

cropped_img = img[50:200, 100:300]

cv2.imshow(‘Original Image’, img)
cv2.imshow(‘Cropped Image’, cropped_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
“`

切片语法 [start_row:end_row, start_col:end_col]

5. 在图像上绘制图形

OpenCV提供了在图像上绘制各种形状和文本的功能。

“`python
import cv2
import numpy as np

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

参数:(height, width, channels),数据类型 np.uint8

canvas = np.zeros((400, 600, 3), dtype=np.uint8)

1. 绘制直线

cv2.line(img, pt1, pt2, color, thickness)

颜色是 BGR 格式 (255, 0, 0) 代表蓝色

cv2.line(canvas, (0, 0), (600, 400), (255, 0, 0), 5)

2. 绘制矩形

cv2.rectangle(img, pt1, pt2, color, thickness)

(50, 50) 是左上角坐标,(200, 150) 是右下角坐标

(0, 255, 0) 代表绿色

thickness = -1 表示填充矩形

cv2.rectangle(canvas, (50, 50), (200, 150), (0, 255, 0), -1)

3. 绘制圆形

cv2.circle(img, center, radius, color, thickness)

(300, 250) 是圆心,75 是半径

(0, 0, 255) 代表红色

cv2.circle(canvas, (300, 250), 75, (0, 0, 255), 3)

4. 绘制文本

cv2.putText(img, text, org, fontFace, fontScale, color, thickness, lineType)

cv2.putText(canvas, “Hello, OpenCV!”, (350, 350), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2, cv2.LINE_AA)

cv2.imshow(‘Drawing on Canvas’, canvas)
cv2.waitKey(0)
cv2.destroyAllWindows()
“`

6. 视频处理基础

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

6.1 读取和显示视频

“`python
import cv2

从文件读取视频

cap = cv2.VideoCapture(‘video.mp4’)

从默认摄像头读取视频 (0 代表第一个摄像头)

cap = cv2.VideoCapture(0)

if not cap.isOpened():
print(“Error: Could not open video stream or file.”)
exit()

while True:
# 逐帧读取视频
ret, frame = cap.read()

# 如果正确读取帧,ret为True
if not ret:
    print("Can't receive frame (stream end?). Exiting ...")
    break

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

# 显示帧
cv2.imshow('Video Feed', frame)
# cv2.imshow('Gray Video Feed', gray_frame)

# 等待 'q' 键按下,25ms 延迟
if cv2.waitKey(25) & 0xFF == ord('q'):
    break

释放VideoCapture对象

cap.release()

销毁所有窗口

cv2.destroyAllWindows()
“`

解释:

  • cv2.VideoCapture(0): 初始化一个视频捕获对象。参数可以是设备索引(如0代表默认摄像头)或视频文件的路径。
  • cap.isOpened(): 检查视频捕获是否成功初始化。
  • cap.read(): 从视频流中读取一帧。它返回两个值:ret(一个布尔值,表示是否成功读取帧)和 frame(读取到的帧,一个NumPy数组)。
  • cap.release(): 释放视频捕获对象,在使用完视频流后必须调用。

6.2 保存视频

保存视频需要创建一个 VideoWriter 对象。

“`python
import cv2

cap = cv2.VideoCapture(0) # 从摄像头读取

if not cap.isOpened():
print(“Error: Could not open video stream or file.”)
exit()

获取帧的宽度和高度

frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

获取帧率

fps = cap.get(cv2.CAP_PROP_FPS)

定义编码器并创建 VideoWriter 对象

cv2.VideoWriter_fourcc(*’XVID’) 用于 .avi 文件

cv2.VideoWriter_fourcc(*’mp4v’) 用于 .mp4 文件 (需要系统支持)

fourcc = cv2.VideoWriter_fourcc(*’XVID’)
out = cv2.VideoWriter(‘output.avi’, fourcc, fps, (frame_width, frame_height))

while True:
ret, frame = cap.read()

if not ret:
    break

# 写入帧
out.write(frame)

cv2.imshow('Recording', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
    break

cap.release()
out.release()
cv2.destroyAllWindows()
print(“视频录制并保存完成。”)
“`

解释:

  • cap.get(propId): 获取视频流的属性,例如 cv2.CAP_PROP_FRAME_WIDTH(宽度)、cv2.CAP_PROP_FRAME_HEIGHT(高度)、cv2.CAP_PROP_FPS(帧率)。
  • cv2.VideoWriter_fourcc(*'XVID'): 定义视频编解码器。XVID 是一个常用的编码器,用于生成 .avi 文件。对于 .mp4 文件,你可能需要 *'mp4v'*'H264',但这取决于你的系统和OpenCV编译配置。
  • cv2.VideoWriter(filename, fourcc, fps, frameSize): 创建一个 VideoWriter 对象。filename 是输出文件名,fourcc 是编解码器,fps 是帧率,frameSize 是帧的尺寸 (width, height)
  • out.write(frame): 将帧写入视频文件。
  • out.release(): 释放 VideoWriter 对象。

7. 总结与展望

本指南只是OpenCV和Python强大功能的冰山一角。你已经学会了:

  • 安装OpenCV-Python库。
  • 读取、显示和保存图像。
  • 执行基本的图像操作,如灰度转换、调整大小和裁剪。
  • 在图像上绘制几何图形和文本。
  • 读取、显示和保存视频流。

OpenCV还提供了海量的功能,包括:

  • 图像滤波和边缘检测 (如Canny, Sobel)
  • 形态学操作 (如腐蚀、膨胀)
  • 特征检测与匹配 (如SIFT, SURF, ORB)
  • 对象检测 (如Haar级联分类器、HOG、深度学习模型如YOLO、SSD)
  • 图像分割 (如GrabCut, 分水岭算法)
  • 相机标定和三维重建
  • 机器学习算法

现在你已经掌握了基础,可以尝试探索OpenCV的官方文档、教程和示例,将这些知识应用到更复杂的计算机视觉项目中。祝你学习愉快!

滚动至顶部