计算机视觉入门:opencv基本操作

作为计算机视觉领域最常用的开源库,OpenCV涵盖了图像读取、显示、处理等一系列基础功能,是入门者必须掌握的核心工具。这篇博客就来梳理一下我们今天讨论学习的关键知识点,也希望能给同样刚入门的朋友一些参考~

一、前置准备:环境搭建

在开始操作之前,首先要完成OpenCV的环境配置。我们今天讨论的是基于Python的环境(Python语法简洁,更适合入门),安装步骤其实很简单,直接通过pip命令即可完成:

附上我安装的版本,老师说版本太高了不适合用于学习,有版权问题而且不稳定等问题。

安装完成后,我们可以在Python脚本中通过import cv2来验证是否安装成功。这里要注意一个小细节,导入时的名称是cv2,而不是opencv-python哦~如果没有报错,就说明环境已经搭建完成,可以正式开始后续的操作了。

二、核心基础操作:图像的读取与显示

图像的读取和显示是OpenCV最基础也是最常用的操作,相当于计算机视觉的"Hello World"。

1. 图像读取:cv2.imread()

cv2.imread()函数用于读取图像文件,需要传入两个主要参数:图像路径和读取模式。

常见的读取模式有三种:

  • cv2.IMREAD_COLOR(默认模式):读取彩色图像,忽略图像的透明度通道,对应数值1;

  • cv2.IMREAD_GRAYSCALE:读取灰度图像,对应数值0;

  • cv2.IMREAD_UNCHANGED:读取完整图像,包含透明度通道,对应数值-1。

注意:参数和对应数值是等价的,比方说读取模式填写cv2.IMREAD_COLOR或者1都是读取彩色图像。

2. 图像显示:cv2.imshow()

cv2.imshow()函数用于在窗口中显示图像,需要传入两个参数:窗口名称和要显示的图像对象。

配合cv2.waitKey()和cv2.destroyAllWindows()函数使用,才能正常显示窗口并控制窗口关闭。cv2.waitKey()用于等待键盘输入,参数为等待时间(单位:毫秒),0表示无限等待;cv2.destroyAllWindows()用于关闭所有打开的窗口。

示例代码:

python 复制代码
import cv2  # 读取的格式是BGR numpy
import numpy as np


a = cv2.imread('img.png')#读取图片
# print(a)  #  NumPy数组,其中存储了读取的图像文件的像素值。
cv2.imshow('tu',a) #显示图片。显示图片的名称,显示的图片数据。
b = cv2.waitKey(0)#是在一个给定的时间内(单位ms)触发;如果用户没有按下键,到时自动结束。设置waitKey(0),代表按任意键继续。
print(b)#当前按下按键 ASCII码值
cv2.destroyAllWindows() #关闭所有打开的窗口并释放所有相关内存。
# ## 对于简单的程序不需要调用这些函数,应用程序的所有资源和窗口在退出时都会由操作系统自动关闭 。
# ## '''调试模型观察shape,dtype、size属性'''
print("图像形状(shape):", a.shape)  #高、宽、通道数
print("图像数据类型(dtype):", a.dtype) #无符号 8 位整数,用于表示像素值的范围在 0 到 255 之间。
print("图像大小(size):", a.size) #表示图像的大小,通常是一个整数,表示图像的总像素数,即图像的高度乘以宽度乘以通道数

执行结果:

这里要注意路径问题:如果图像文件和Python脚本在同一目录下,直接写文件名即可;如果不在同一目录,需要写完整的绝对路径(比如"D:/images/test.jpg")。如果路径错误,函数会返回None,后续操作会报错。

三、进阶基础:图像的保存与简单处理

掌握了读取和显示后,我们还讨论了图像的保存和简单的灰度转换、尺寸调整操作。

1. 图像保存:cv2.imwrite()

cv2.imwrite()函数用于将处理后的图像保存到指定路径,参数为保存路径(包含文件名和格式)和要保存的图像对象。

运行后,就会在指定路径下生成一张名为"test_gray.jpg"的灰度图像。

2. 简单图像处理:灰度转换与尺寸调整

除了直接读取灰度图像,我们还可以通过cv2.cvtColor()函数将彩色图像转换为灰度图像,该函数用于颜色空间转换,参数为原始图像和转换模式(cv2.COLOR_BGR2GRAY表示BGR空间转灰度空间)。

尺寸调整可以使用cv2.resize()函数,需要传入原始图像和目标尺寸(宽,高),也可以指定缩放比例。

这里我们直接对a进行截取,因为图片以数组形式存储,通过数组索引即可。

这里有个重要的小知识点:OpenCV读取的彩色图像默认是BGR颜色空间,而我们平时常见的图像是RGB颜色空间。如果后续需要和其他库(比如Matplotlib)配合使用,需要进行BGR到RGB的转换(cv2.COLOR_BGR2RGB),否则显示的图像颜色会失真。

代码示例:

python 复制代码
import cv2
'''读取灰度图,截取'''
a=cv2.imread("img.png",0)#0表示读取灰度图,等价于cv2.IMREAD_GRAYSCALE
b=a[30:100,40:150]
cv2.imwrite("imggray.png",a)
cv2.imshow("hh",a)
cv2.imshow("hhh",b)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果:

3、分隔通道

代码实例:

python 复制代码
import cv2
a=cv2.imread("img.png")
'''分割通道'''
a1=a[:,:,0]
a2=a[:,:,1]
a3=a[:,:,2]
#另一种方法
b,g,r=cv2.split(a)
cv2.imshow("b",b)
cv2.imshow("g",g)
cv2.imshow("r",r)
cv2.waitKey(0)
'''注意:我们这里是显示蓝色通道的图像,但是所显示的图片确是灰色的,那是因为只显示蓝色通道时,实际上是将
蓝色通道作为亮度值,是单个通道,这会导致图像呈现为灰色。想要展示只包含蓝色通道信息
的彩色图像,可以将图像中的绿色通道和红色通道设为0,即移除绿色和红色,只保留蓝色。'''

a[:,:,1]=0
a[:,:,2]=0
cv2.imshow("a",a)
cv2.waitKey(0)

运行结果:

四、视频处理

opencv是用于图片识别、分析等操作的库,因此对是平的处理其实就是对图片处理,不能处理音频,比如我们这里逐帧播放视频,其实就是一张一张放出图片。

代码实例:

python 复制代码
'''本质是逐帧的处理图片'''

import cv2

# 打开视频文件
video_capture = cv2.VideoCapture('20250723-155313-template-f8c3.mp4')
# video_capture = cv2.VideoCapture(0)#参数0表示摄像头
# 检查视频是否成功打开
if not video_capture.isOpened():
    print("无法打开视频文件")
    exit()

# 循环读取视频帧
while True:
    # 逐帧读取视频
    ret, frame = video_capture.read()  # ret是布尔值,表示是否成功读取了帧,frame 是读取到的帧
    #video_capture.read() 每次返回两个值,一个布尔一帧图片
    # 检查是否成功读取帧
    if not ret:
        break
    # 将图像从一种颜色空间转换为另一种颜色空间。(在此可添加各种对图片的处理步骤已达到对视频处理的效果)
    frame=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#还有很多其他格式可以转换
    # 显示当前帧
    cv2.imshow(  'video', frame)
    # 检查用户是否按下 'esc' 键,如果是则退出循环
    if cv2.waitKey(60) == 27:
        break

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

运行结果:

一个逐帧播放的效果,注意 到我们opencv库是可以调用摄像头的:video_capture = cv2.VideoCapture(0)#参数0表示摄像头。

五、学习小结与感悟

今天的讨论学习,我们从环境搭建开始,一步步掌握了OpenCV的图像读取、显示、保存以及简单的处理操作。这些操作虽然基础,但却是计算机视觉的基石------后续的图像识别、目标检测等复杂应用,都是在这些基础操作的基础上展开的。

学习过程中,我们也踩了一些小坑,比如路径错误导致图像读取失败、忘记用waitKey()函数导致窗口无法正常显示、忽略BGR和RGB的颜色空间差异导致图像颜色异常等。这些小问题也提醒我们,学习技术一定要注重细节,多动手实践,遇到问题多调试,才能真正掌握。

接下来,我们计划继续深入学习OpenCV的图像预处理(比如阈值处理、滤波、边缘检测等),逐步搭建起计算机视觉的知识体系。如果屏幕前的你也在入门计算机视觉,欢迎一起交流学习~

相关推荐
董厂长2 小时前
温度设为 0 仍然不完全确定:LLM 推理非确定性从哪来、怎么测、如何缓解
人工智能·llm·agent
wenzhangli72 小时前
深度解析Ooder架构:A2UI时代全栈设计的四大核心思考
大数据·人工智能
m0_462605222 小时前
第N11周:seq2seq翻译实战-Pytorch复现
人工智能·pytorch·python
LiFileHub2 小时前
ISO/IEC TR 29119-11:2020中文版
人工智能
光影34152 小时前
调用阿里的通义千问3-VL-Flash 系统提示词和用户提示词使用的token量比较
人工智能
啊阿狸不会拉杆2 小时前
《数字图像处理》实验3-频率域处理方法
图像处理·人工智能·算法·计算机视觉·数字图像处理
哥本哈士奇2 小时前
使用Gradio构建AI前端 - RAG召回测试
前端·人工智能
赋创小助手2 小时前
超微SYS-821GE-TNHR深度测评:8卡 NVIDIA H200 风冷 AI 服务器
运维·服务器·人工智能·深度学习·计算机视觉·语言模型·自然语言处理
xwz小王子2 小时前
Mini3DV 2025 | 观点总结:具身智能前沿与展望
人工智能·3d