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. 读取与显示图像

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. 图像属性查看

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

运行结果:

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

3. 灰度图转换

# 以灰度模式读取图像(参数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. 图像保存

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

产生immg.png图片:

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

5. 图像切片(裁剪)

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. 调用摄像头

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. 通道分离与显示

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. 通道修改

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 列的区域会被随机颜色覆盖

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区域 

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. 图像缩放

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__)查看版本)。祝大家在计算机视觉的路上越走越远!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/92517.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/92517.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2.2.1 饰面板材和陶瓷的特性和应用

1、饰面石材1)天然花岗岩2)天然大理石3)人造石(1)人造石按主要原材料分包括人造石实体面材、人造石英石和人造石岗石等产品。2、建筑卫生陶瓷建筑卫生陶瓷包括建筑陶瓷和卫生陶瓷两大类。建筑陶瓷包括陶瓷砖、建筑琉璃…

C++的结构体数组

结构体数组的基础知识 结构体数组通过​​组合数据批量管理​​的特性,广泛应用于学生管理、游戏角色属性存储等场景。常见问题 ​​数组越界​​:静态数组长度固定,超过数组长度的访问,会导致未定义行为。​​未初始化成员​​&a…

小程序中使用echarts(2025/8/8)

这篇博文讲的很详细,也很简洁,这里补充一点东西 小程序中使用echarts(硬货,全网最详细教程!)_小程序使用echarts-CSDN博客 简单来说就是去官网下载ec-canvas组件,将其中的echarts.js换成echarts.min.js(原…

【SpringBoot】SpringBoot配置

根据自动配置原理 学习后,整理学习笔记 一定要耐心去看,耐着性子去学习,慢慢慢慢就明白了 配置深化学习 前提 通过 SpringBootApplication 找到 EnableAutoConfiguration;发现 Import({AutoConfigurationImportSelector.class})…

网络安全与软件定义汽车的发展

在许多汽车公司,同一个系统工程团队同时负责安全(safety)和安防(security)。因此,网络安全被视为安全(safety)的一个子集,其根源在于一个隐含的假设:“如果安…

字典列表依据数值键排序

要根据字典列表中的特定数值键进行排序,我们可以使用 Python 的 sorted() 函数配合自定义排序键。以下是操作方法: 1. 按升序排序(从小到大) sorted_list sorted(original_list, keylambda x: x[数值键名])2. 按降序排序&#xf…

五、SpringBoot工程打包与运行

SpringBoot工程打包与运行 1、SpringBoot项目快速启动(Windows版) (1)对SpringBoot项目打包(执行Maven构建指令package): mvn package (2)运行项目(执行启动指令) java -jar springboot.jar 2、…

构建高可用架构:ZDNS GSLB 在多数据中心场景下的应用与 F5 替换实践

随着互联网的快速发展,金融机构、大型企业等组织单位,出于自身业务发展的需要和国家监管的要求,纷纷通过建设多数据中心来提升不同地区的用户体验,同时避免不可抗力因素带来的巨大损失。ZDNS GSLB 全局负载均衡技术,能…

【JMeter】压测脚本生成完善增强

JMeter 压测脚本生成完善增强0. 通过JMeter代理服务器录制脚本1. 设置客户端的代理2. JMeter GUI配置 以及录制脚本3. 调试脚本附录0. 通过JMeter代理服务器录制脚本 1. 设置客户端的代理 JMeter代理服务器默认端口号就是8888 2. JMeter GUI配置 以及录制脚本 新建线程组 …

Agent 开发进阶路线:从基础功能到自主决策

Agent 开发进阶路线:从基础功能到自主决策基础功能构建定义 Agent 的核心功能,如信息收集、简单任务执行和环境交互。 实现基本的感知-决策-执行循环,确保 Agent 能响应外部输入并完成预设任务。 集成 API 调用或传感器交互,扩展 …

使用 ECharts GL 实现 3D 中国地图点位飞线效果

前言在现代数据可视化领域,3D 地图飞线效果是一种非常吸引人的展示方式,特别适合展示地理空间关系和数据流动。本文将详细解析如何使用 ECharts GL 在 Vue 项目中实现一个 3D 中国地图飞线效果。技术栈Vue.js 2.x/3.xECharts 5.xECharts GL 2.x核心实现步…

Redis对象编码

前言 Redis中提供多种数据结构:string、list、map、set、zset等,关于上述多种数据类型的底层实现原理,Redis针对不同的数据类型对应的不同使用场景从时间和空间上进行平衡选择不同的对象编码方式。本文大致介绍一些Redis对象编码方式以及在上…

12-Django项目实战-登录短信验证

1.路由配置 2.对接第三方短信接口 详细内容请点击 3.视图函数 def sms_view(request):"""短信验证视图逻辑1.获取请求体的数据[phone]2.调用封装的短信发送接口,实现发送短信"""data json.loads(request.body)phone data.get(&q…

Java技术栈/面试题合集(11)-设计模式篇

场景 Java入门、进阶、强化、扩展、知识体系完善等知识点学习、性能优化、源码分析专栏分享: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/140870227 通过对面试题进行系统的复习可以对Java体系的知识点进行查漏补缺。 注: 博客: 霸道流氓气质-CSDN博…

Linux系统:Ext系列文件系统(软件篇)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录[TOC](文章目录)一,ext2文件系统1-1 宏观认识1-2 Block Group1-3 块组内部构成1-3-1 超级块(Super Block)1-3-2 块组描述符表GDT(Group Descriptor Table…

14. isaacsim4.2教程-April Tags/给相机加噪声

1. 前言April Tags 是一种视觉标签(类似 QR 码),用于通过相机进行定位和识别。它们通常用于计算机视觉任务中,帮助机器人识别和定位自己在物理空间中的位置,或者识别和追踪特定对象。前提条件启用 ROS 桥接&#xff1a…

Kafka + 时间轮 + 数据库实现延迟队列方案

Kafka 原生不支持延迟队列功能。而RabbitMQ、RocketMQ及Redis等其他消息队列原生支持延迟队列。 RabbitMQ RocketMQ Redis 实现方式 通过插件实现,消息进入延迟队列后根据配置时间过滤转发。 原生支持,发送消息时设置延迟级别,定时任务处…

力扣 hot100 Day69

287. 寻找重复数 给定一个包含 n 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。 假设 nums 只有 一个重复的整数 ,返回 这个重复的数 。 你设计的解决方案必须 不修改…

Android 的CameraX的使用(配置,预览,拍照,图像分析,录视频)

Android Studio 版本号:2024.1.2 CameraX是Jetpack系列中的一个库,它基于Camera2 API构建,但提供了更高层次的抽象。 CameraX 三大核心用例: Preview预览 ,ImageCapture拍照和 VideoCapture录视频 一、创建项目,进行环境配置 CameraX 需要一些属于 Java 8 的方法,因此…

【机器学习深度学习】微调训练数据质量

目录 前言 一、为什么数据质量评估很重要 二、数据质量评估的核心维度 三、数据质量的可量化维度(必须要测的指标) 四、多答案、多类型数据的取舍与优化 场景 A:一个问题有多个相似回答 场景 B:多个类型数据,每…