OpenCV 入门实战:从环境配置到图像 / 视频处理

OpenCV 是计算机视觉领域最常用的开源库之一,它提供了丰富的图像和视频处理功能。本文将从环境配置开始,带大家一步步解析基础操作代码,快速入门 OpenCV 的使用。

一、环境配置

在开始之前,我们需要先搭建好 OpenCV 的运行环境。

1. 安装 Python

OpenCV 支持多种编程语言,其中 Python 接口最为易用。首先确保你的电脑上安装了 Python(推荐 3.7 及以上版本),可以从Python 官网下载安装。

2. 安装 OpenCV 库

打开命令行(Windows 系统可使用 Win+R 输入 cmd,Mac/Linux 使用终端),输入以下命令安装 OpenCV:

复制代码
pip install opencv-python

如果需要额外的扩展功能(如视频处理相关模块),可以安装:

复制代码
pip install opencv-contrib-python

二、代码解析:图像基本操作

1. 读取与显示图像

python 复制代码
import cv2
# 读取图像(默认以BGR格式读取)
a = cv2.imread('img.png')
# 显示图像,第一个参数是窗口名称,第二个是图像数据
cv2.imshow('cute', a)
# 等待按键(0表示无限等待),返回值是按键的ASCII码
b = cv2.waitKey(0)
# 关闭所有窗口
cv2.destroyAllWindows()

运行结果:

关键说明

  • cv2.imread():如果路径错误会返回None,建议使用绝对路径或检查文件是否存在
  • cv2.imshow():需要配合cv2.waitKey()使用,否则窗口会一闪而过
  • cv2.waitKey(0):等待用户按下任意键,按下的键值会被返回(如按 ESC 键返回 27)

2. 图像属性查看

python 复制代码
print(b)  # 输出按下的按键ASCII码
print("图像形状", a.shape)  # 输出(高度, 宽度, 通道数),彩色图通道数为3
print("图像数据类型", a.dtype)  # 通常为uint8(0-255的整数)
print(f"图像大小:", a.size)  # 总像素数 = 高度×宽度×通道数

运行结果:

按下的是'q'返回的是'q'的ASCII码,按下其他的是窗口关闭返回其他按键的ASCII码

3. 灰度图转换

python 复制代码
# 以灰度模式读取图像(参数cv2.IMREAD_GRAYSCALE)
b = cv2.imread(r'./img.png', cv2.IMREAD_GRAYSCALE)
cv2.imshow('xx', b)
a = cv2.waitKey(0)
cv2.destroyAllWindows()
# 灰度图的形状是(高度, 宽度),通道数为1
print("图像形状:", b.shape)
print("图像数据类型:", b.dtype)
print("图像大小:", b.size)  # 总像素数 = 高度×宽度
  • 图像转化为灰度图
  • 返回图像属性

4. 图像保存

python 复制代码
# 将灰度图保存为新文件
cv2.imwrite('immg.png', b)

产生immg.png图片:

注意imwrite()的第一个参数是保存路径,第二个是图像数据,支持 png、jpg 等多种格式。

5. 图像切片(裁剪)

python 复制代码
a = cv2.imread(r'./img.png')
# 切片格式:[起始行:结束行, 起始列:结束列](行数对应高度,列数对应宽度)
b_qie = a[30:230, 100:300]  # 裁剪从第30行到230行,第100列到300列的区域
cv2.imshow('yuantu', a)       # 显示原图
cv2.imshow('qiepian', b_qie)  # 显示切片区域
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果:

三、代码解析:视频处理基础

1. 调用摄像头

python 复制代码
import cv2
# 打开摄像头(0表示默认摄像头,也可以传入视频文件路径)
video_caputure = cv2.VideoCapture(0) 
if not video_caputure.isOpened():
    print("无法打开摄像头或文件")
    exit()
while True:
    # 读取一帧画面,ret是布尔值表示是否读取成功,frame是帧数据
    ret, frame = video_caputure.read()
    if not ret:
        break  # 读取失败则退出循环
    # 可选:将彩色帧转为灰度帧
    # frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    cv2.imshow('Video', frame)
    # 每60毫秒检测一次按键,按下ESC键(ASCII码27)退出
    if cv2.waitKey(60) == 27:
        break
# 释放摄像头资源
video_caputure.release()
cv2.destroyAllWindows()

运行结果:

  1. video_caputure = cv2.VideoCapture(0) :括号里也可传入视频地址。

四、代码解析:图像通道操作

OpenCV 读取的彩色图像默认是 BGR 格式(蓝、绿、红),而非常见的 RGB 格式,这一点需要特别注意。

1. 通道分离与显示

python 复制代码
import cv2
a = cv2.imread(r'./img.png')
# 直接通过索引获取通道(0=蓝,1=绿,2=红)
a1 = a[:, :, 0]  # 蓝色通道
a2 = a[:, :, 1]  # 绿色通道
a3 = a[:, :, 2]  # 红色通道
# 或使用split函数分离通道
b, g, r = cv2.split(a)
# 分别显示三个通道(单通道图像会以灰度形式显示,值越高越亮)
cv2.imshow('b', b)
cv2.imshow('g', g)
cv2.imshow('r', r)
cv2.waitKey(10000)  # 等待10秒

运行结果:

2. 通道修改

python 复制代码
a_new = a.copy()  # 复制原图,避免修改原图
# 将绿色通道和红色通道设为0,只保留蓝色通道
a_new[:, :, 1] = 0
a_new[:, :, 2] = 0
cv2.imshow('result2', a_new)  # 显示纯蓝色图像
cv2.waitKey(10000)
cv2.destroyAllWindows()

运行结果:

五、代码解析:图像编辑进阶

1. 图像涂鸦

  1. 左侧:a [100:200, 200:300]: 选取图像中,100:200 表示选取图像的行范围(垂直方向)200:300 表示选取图像的列范围(水平方向) 100×100 像素的矩形区域

  2. 右侧:np.random.randint (0, 256, (100, 100, 3)): np.random.randint() 生成指定范围的随机整数,0, 256 表示生成 [0, 255] 之间的整数(符合图像像素值范围),(100, 100, 3) 表示生成的数组形状:100 行、100 列、3 个通道(与左侧选取的区域大小完全匹配)生成一个充满随机颜色值的三维数组,模拟彩色图像的像素数

将右侧生成的随机颜色数组,赋值给左侧选取的图像区域,图像中 100:200 行、200:300 列的区域会被随机颜色覆盖

python 复制代码
import cv2
import numpy as np
a = cv2.imread(r'img.png')
# 在图像的(100:200行, 200:300列)区域填充随机颜色
a[100:200, 200:300] = np.random.randint(0, 256, (100, 100, 3))
cv2.imshow('masaike', a)
cv2.waitKey(1000000)  # 长时间等待,方便观察

运行结果:

2. 图像融合(粘贴)

b[200:350, 200:350] = a[50:200, 100:250]:将右侧150×150 的区域复制粘贴给左侧150×150区域

python 复制代码
a = cv2.imread('img.png')
b = cv2.imread('longnv.webp')
# 将a的(50:200行, 100:250列)区域粘贴到b的(200:350行, 200:350列)区域
# 注意:两个区域的大小必须一致(150x150)
b[200:350, 200:350] = a[50:200, 100:250]
cv2.imshow('b', b)
cv2.imshow('a', a)
cv2.waitKey(10000)

运行结果:

3. 图像缩放

python 复制代码
a = cv2.imread('img.png')
# 将图像缩放到宽度200,高度600(注意参数是(width, height))
a_new = cv2.resize(a, (200, 600))
cv2.imshow('a', a)
cv2.imshow('a_new', a_new)
cv2.waitKey(10000)
cv2.destroyAllWindows()

运行结果:

六、总结

这些操作是 OpenCV 的基础,掌握后可以进一步学习更复杂的功能,如边缘检测、目标识别等。建议大家多动手尝试,修改代码中的参数(如切片范围、缩放尺寸),观察结果变化,加深理解。

如果运行中遇到问题,首先检查文件路径是否正确,其次确认 OpenCV 版本是否兼容(可以通过print(cv2.__version__)查看版本)。祝大家在计算机视觉的路上越走越远!

相关推荐
飞翔的佩奇2 小时前
【完整源码+数据集+部署教程】海上场景水上交通物体检测图像分割系统源码和数据集:改进yolo11-HGNetV2
python·yolo·计算机视觉·毕业设计·数据集·yolo11·水上交通物体检测
大熊背2 小时前
基于人眼视觉特性的相关图像增强基础知识介绍
人工智能·算法·计算机视觉
无线图像传输研究探索3 小时前
无人机图传的得力助手:5G 便携式多卡高清视频融合终端的协同应用
5g·音视频·无人机·无线图传·5g单兵图传·单兵图传·无人机图传
DogDaoDao3 小时前
深入理解VideoToolbox:iOS/macOS视频硬编解码实战指南
macos·ios·音视频·实时音视频·视频编解码·videotoolbox·硬编码
2zcode4 小时前
基于Matlab融合深度学习的视频电梯乘客人数检测平台研究
深度学习·matlab·音视频
Sunhen_Qiletian9 小时前
计算机视觉前言-----OpenCV库介绍与计算机视觉入门准备
人工智能·opencv·计算机视觉
小王爱学人工智能11 小时前
5分钟了解OpenCV
人工智能·opencv·计算机视觉
格林威12 小时前
工业相机使用 YOLOv8深度学习模型 及 OpenCV 实现目标检测简单介绍
人工智能·深度学习·数码相机·opencv·yolo·目标检测·计算机视觉
qq_5260991313 小时前
VC6800智能相机:赋能智能制造,开启AI视觉新纪元
图像处理·计算机视觉·自动化·相机