一、OpenCV 简介

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,自1999年由Intel发起,现已成为全球最流行的视觉库之一。它包含超过2500种优化算法,涵盖图像处理、物体检测、人脸识别、3D重建、视频分析等众多领域。OpenCV支持多种编程语言(C++、Python、Java等),并可在Windows、Linux、macOS、Android等平台上运行,广泛应用于学术研究、工业检测、安防监控、自动驾驶等领域。

二、核心功能

  • 图像处理:滤波、边缘检测、形态学操作、色彩空间转换(如RGB转灰度)。

  • 视频分析:运动检测、背景减除、光流计算、目标跟踪。

  • 物体检测:内置Haar级联分类器(人脸、眼睛检测),并支持深度学习模型(YOLO、SSD等)。

  • 机器学习:集成SVM、KNN、决策树等经典分类器,并提供训练与预测接口。

  • 相机标定与3D视觉:摄像头内参/外参标定、立体匹配、三维重建。

三、安装相关库

使用Python操作OpenCV,主要安装两个核心库:

pip install opencv-python==3.4.18.65        # 核心图像处理模块
pip install opencv-contrib-python==3.4.18.65 # 包含额外贡献模块(如SIFT、SURF等)

注:版本号可根据需求选择,这里以3.4.18.65为例,如需最新版可去掉版本号。

四、基础操作详解

1. 读取和显示图片

OpenCV使用imread()读取图片,默认以BGR格式存储为NumPy数组。imshow()显示图像,waitKey()等待键盘输入,destroyAllWindows()释放窗口。

import cv2

# 读取图片(默认BGR格式)
a = cv2.imread('timg98.jpg')

# 显示图片,窗口名称为'tu'
cv2.imshow('tu', a)

# 等待按键,参数0表示无限等待,返回按键的ASCII码
b = cv2.waitKey(0)
print('按下按键的ASCII码:', b)

# 关闭所有窗口
cv2.destroyAllWindows()

# 查看图像属性
print("图像形状 (高,宽,通道):", a.shape)   # 例如 (480, 640, 3)
print("图像数据类型 (dtype):", a.dtype)    # uint8
print("图像大小 (size):", a.size)          # 高×宽×通道

运行结果说明

程序会弹出一个窗口显示原图,按下任意键后窗口关闭,控制台输出图像的形状(如(480,640,3))、数据类型(uint8)和总像素数(如921600)。

2. 读取灰度图与保存

通过cv2.IMREAD_GRAYSCALE参数直接读取灰度图,也可用cvtColor转换。imwrite()保存图像。

import cv2

# 以灰度模式读取
b = cv2.imread(r'./timg98.jpg', cv2.IMREAD_GRAYSCALE)

# 显示灰度图
cv2.imshow('xx', b)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 保存灰度图
cv2.imwrite('timg9888_GRAY.jpg', b)

print("灰度图形状 (shape):", b.shape)       # 只有高和宽,例如 (480, 640)
print("灰度图数据类型 (dtype):", b.dtype)   # uint8
print("灰度图大小 (size):", b.size)         # 高×宽

运行结果说明

显示黑白灰度图像,并在当前目录生成保存的灰度图文件。灰度图形状为(高,宽)。

3. 视频文件读取

视频处理是计算机视觉中的重要环节。OpenCV通过VideoCapture类提供对视频文件、摄像头甚至网络视频流的读取支持。

import cv2

# 打开视频文件(若调用摄像头则使用 VideoCapture(0))
video_capture = cv2.VideoCapture('转场.mp4')
if not video_capture.isOpened():
    print("无法打开视频文件")
    exit()

while True:
    # 逐帧读取视频
    ret, frame = video_capture.read()  # ret为布尔值,表示是否成功读取;frame为当前帧图像
    if not ret:
        break  # 视频播放完毕或出错,退出循环

    # 可选:将彩色帧转为灰度图以减少计算量
    # frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 显示当前帧
    cv2.imshow('Video', frame)

    # 按ESC键退出(ASCII 27),等待10ms控制播放速度
    if cv2.waitKey(10) == 27:
        break

# 释放资源
video_capture.release()
cv2.destroyAllWindows()

关键点解析

  • VideoCapture()参数可以是视频文件路径、摄像头索引(0表示默认摄像头)或网络流地址。

  • isOpened()确保资源成功打开,避免后续操作出错。

  • read()方法每次返回一帧,ret用于判断是否还有有效帧,视频播放完毕时retFalse

  • 通过waitKey()控制每帧停留时间(单位毫秒),同时检测按键输入,ESC键(ASCII 27)可提前终止播放。

  • 最后必须调用release()释放摄像头或文件资源,避免资源泄漏;destroyAllWindows()关闭所有显示窗口。

运行结果说明

程序弹窗播放视频,每帧停留10ms,按下ESC键停止播放。若取消灰度转换注释,则播放灰度视频。

4. ROI(感兴趣区域)

ROI(Region of Interest)指图像中需要重点处理的局部区域。通过NumPy切片直接截取矩形区域,便于后续分析。

import cv2

a = cv2.imread(r'./timg98.jpg')
# 截取行30~230,列100~300的区域
b = a[30:230, 100:300]

cv2.imshow('yuantu', a)
cv2.imshow('qiepian', b)
cv2.waitKey(100000)  # 等待100秒
cv2.destroyAllWindows()

运行结果说明

同时显示原图和截取的局部区域,ROI窗口只显示切片部分,便于观察细节。

5. 提取RGB颜色通道

OpenCV中图像通道顺序为BGR。可以通过索引或split()提取单通道,但直接显示单通道会呈现灰度,因为其他通道被置为0。若要显示纯色通道的彩色效果,需将其他通道清零。

import cv2

# 读取图像
a = cv2.imread(r'./timg98.jpg')

# 使用cv2.split()分离通道
b, g, r = cv2.split(a)  # b:蓝通道, g:绿通道, r:红通道

# 显示绿色通道(灰度图)
cv2.imshow('result', g)
cv2.waitKey(10)
cv2.destroyAllWindows()

# 若要显示纯蓝色通道的彩色效果,将绿和红通道置0
a_new = a.copy()
a_new[:, :, 1] = 0  # 绿色通道设为0
a_new[:, :, 2] = 0  # 红色通道设为0
cv2.imshow('Blue Channel Color', a_new)
cv2.waitKey(1000)
cv2.destroyAllWindows()

运行结果说明

第一个窗口显示绿色通道的灰度图,亮度代表绿色强度;第二个窗口显示纯蓝色调图像(只有蓝色通道有值),呈现蓝色效果。

6. 合并颜色通道

使用merge()将分离的B、G、R通道重新组合成彩色图像。

import cv2

# 读取图像
a = cv2.imread(r'./timg98.jpg')

# 分离通道
b, g, r = cv2.split(a)

# 重新合并
img = cv2.merge((b, g, r))  # 顺序必须BGR

cv2.imshow('result', img)
cv2.waitKey(100000)
cv2.destroyAllWindows()

运行结果说明

显示与原始图像完全相同的彩色图像,证明通道合并正确恢复了原图。

五、总结

本文从OpenCV的简介与安装入手,通过详细的代码示例讲解了图像/视频的读取、显示、保存、ROI截取、颜色通道的提取与合并等基础操作。掌握这些基础是进一步学习图像处理、计算机视觉高阶任务(如目标检测、人脸识别)的前提。建议读者亲自运行每段代码,观察不同参数对结果的影响,在实践中加深理解。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐