当前位置: 首页 > news >正文

计算机视觉--opencv(代码详细教程)

在计算机视觉的广袤领域中,OpenCV 是一座极为关键的里程碑。无论是在前沿的学术研究,还是在蓬勃发展的工业界,OpenCV 凭借其强大的功能与高效的性能,为开发者提供了丰富的图像处理和计算机视觉算法,助力无数项目落地。本文将深入探讨 OpenCV 的基础知识,包括其核心概念、安装配置、常用操作以及实际应用,希望能帮助读者全面掌握 OpenCV,为后续的计算机视觉开发筑牢根基。

一、 OpenCV 是什么?

OpenCV,即 Open Source Computer Vision Library,是一个基于 BSD 许可发行的跨平台计算机视觉库。它由英特尔公司发起并参与开发,历经多年的持续发展与完善,已经成为计算机视觉领域的行业标准之一。OpenCV 支持 C++、Python、Java 等多种主流编程语言,极大地降低了开发者的学习门槛。同时,它拥有超过 2500 种优化算法,从基础的图像滤波、特征提取,到复杂的目标检测、立体视觉和机器学习算法,几乎涵盖了计算机视觉的各个方面。OpenCV 的高效性和易用性,使其在学术研究、工业生产和商业产品中都得到了广泛的应用。

二、 安装 OpenCV

Python 环境下安装

在 Python 环境中,使用pip工具可以轻松安装 OpenCV。打开命令行终端,输入以下命令:

pip install opencv - python

三、Opencv的简单操作

1、Opencv的导入

在python中Opencv用cv2来表示

import cv2

2、图片的读取

这里的图片可以是任意一张图片,网站上随便下载一张就行,这里就不附文件了

图片的读取不能有中文

# a = cv2.imread('mm.jpg')#路径不可为中文
# cv2.imshow('tu', a)
# b = cv2.waitKey(10000000)
# print(b)  # 打印按下按键对应的 ASCII 码,无按键则返回 -1
# cv2.destroyAllWindows()#释放缓存
# print('图像属性')
# print("图像形状(shape):", a.shape)
# print("图像数据类型(dtype):", a.dtype)
# print("图像大小(size):", a.size)

3、图片的灰度转换

# b = cv2.imread('mm.jpg', cv2.IMREAD_GRAYSCALE)
# cv2.imshow('xx', b)
# cv2.waitKey(0)
# cv2.destroyAllWindows()#释放缓存
# print('灰度图像属性')
# print("图像形状(shape):", b.shape)
# print("图像数据类型(dtype):", b.dtype)
# print("图像大小(size):", b.size)
# # 保存灰度图像
# cv2.imwrite('ting98_GRAY.jpg', b)

4、视频文件读取

这里规定了waitKey == 27就表示按下ASCLL码值为27(ESC键)才能退出播放

video_capture = cv2.VideoCapture('your_name.mp4')
if not video_capture.isOpened():print('无法打开文件:')exit()
while True:ret,frame = video_capture.read()if not ret:break# frame = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)cv2.imshow('video',frame)if cv2.waitKey(60) == 27:break
video_capture.release()
cv2.destroyAllWindows()#每次运行完都要释放缓存

5、ROI提取

这个看上去高大上,但实际上就是python基础里的切片,将图片上的某部分提取出来

a = cv2.imread('mm.jpg')  # 重新读图(确保 a 有效,也可复用之前的 a ,这里为清晰重写 )
if a is not None:# ROI 切片:行范围 350-650 ,列范围 250-500 (根据需求调整)b = a[350:650, 250:500]cv2.imshow('yuantu', a)   # 显示原图cv2.imshow('qiepian', b)  # 显示 ROI 区域cv2.waitKey(0)            # 按任意键继续cv2.destroyAllWindows()

6、RGB 颜色通道提取

a = cv2.imread(r'./img.png')
b = cv2.imread(r'./mm.png')
# 2. 提取颜色通道
a1 = a[:, :, 0]  # 蓝色通道(B通道)
a2 = a[:, :, 1]  # 绿色通道(G通道)
a3 = a[:, :, 2]  # 红色通道(R通道)
blue=np.zeros_like(b)
blue[:, :, 0] =b[:, :, 0]
# 或者使用 cv2.split() 来分离颜色通道
b, g, r = cv2.split(a)# 4. 设置窗口显示时间,单位为毫秒(这里设置为100秒,可以根据需要调整)
cv2.waitKey(100000)
# 5. 关闭所有窗口
cv2.destroyAllWindows()

注意:我们这里是显示蓝色通道的图像,但是所显示的图片确是灰色的,那是因为只显示蓝色通道时, 实际上是将蓝色通道作为亮度值,是单个通道,这会导致图像呈现为灰色。 想要展示只包含蓝色通道信息的彩色图像,可以将图像中的绿色通道和红色通道设为0,即移除绿色和红色,只保留蓝色。


7、合并颜色

这个和上面的颜色通道提取差不多,就是把提取后的数据再拼接回去,可以自由组合,这里演示的是合并原图片

# '''合并颜色通道'''
# 1. 读取图像
a = cv2.imread('img.png')
# 2. 提取颜色通道
a1 = a[:, :, 0]  # 蓝色通道(B通道)
a2 = a[:, :, 1]  # 绿色通道(G通道)
a3 = a[:, :, 2]  # 红色通道(R通道)
# 或者使用 cv2.split() 来分离颜色通道
b, g, r = cv2.split(a)
# b 包含蓝色通道  g 包含绿色通道  r 包含红色通道
# 使用cv2.merge()函数将三个通道重新合并成一个图像
img = cv2.merge((b, g, r))
# img = cv2.merge((a1,a2,a3)) #或者使用这行代码
cv2.imshow('result3', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

8、图片修改

1、图片打码

a = cv2.imread('img.png')
a[100:200, 200:300] = np.random.randint(0, 256, (100, 100, 3))  # 矩阵赋值必须是相同大小
cv2.imshow(winname='masaike', mat=a)
cv2.waitKey(1000000)
cv2.destroyAllWindows()

2、图片组合

这里可以将图片的部分组合起来

a = cv2.imread('img.png')
b = cv2.imread('mm.jpg')
b[200:350, 200:350] = a[50:200, 100:250]  # 注意:矩阵的大小必须要统一。
cv2.imshow(winname='b', mat=b)
cv2.imshow(winname='a', mat=a)
cv2.waitKey(1000000)
cv2.destroyAllWindows()

3、图片缩放

# 图片缩放cv2.resize
# 用于调整图像的大小。它有以下几个参数:
# src: 要调整大小的输入图像,可以是numpy数组、PIL图像或其他类型。
# dsize: 输出图像的大小,可以是一个元组,例如(宽, 高), 或者使用整数标量来缩放原始图像。如果dsize为None, 则根据scale
# fx: 沿x轴的缩放系数。
# fy: 沿y轴的缩放系数。
a = cv2.imread('mm.jpg')
a_new = cv2.resize(a, dsize=(200, 600))  # 宽、高
# a_new = cv2.resize(a, dsize=None, fx=1.5, fy=0.5)
# print(a.shape)  # 高、宽、通道数
cv2.imshow(winname='a', mat=a)
cv2.imshow(winname='a_new', mat=a_new)
cv2.waitKey(1000000)
cv2.destroyAllWindows()

http://www.dtcms.com/a/318961.html

相关文章:

  • ansible-playbook之获取服务器IP存储到本地文件
  • Spring事务失效场景?
  • 光纤滑环 – 光纤旋转接头(FORJ)- 杭州驰宏科技
  • 科技云报到:热链路革命:阿卡 CRM 的 GTM 定位突围
  • 芯谷科技--高效噪声降低解决方案压缩扩展器D5015
  • 全球化2.0 | 泰国IT服务商携手云轴科技ZStack重塑云租赁新生态
  • 安全守护,温情陪伴 — 智慧养老产品上新
  • Element Plus实现分页查询
  • 码头岸电系统如何保障供电安全?安科瑞绝缘监测及故障定位方案解析
  • Rust爬虫与代理池技术解析
  • NAS技术在县级融媒体中心的架构设计与安全运维浅析
  • VSCode ssh一直在Setting up SSH Host xxx: Copying VS Code Server to host with scp等待
  • 支付宝小程序商城怎么搭?ZKmall开源商城教你借力蚂蚁生态做增长
  • 【Agent】ReAct:最经典的Agent设计框架
  • 【pytorch(06)】全连接神经网络:基本组件认知,线性层、激活函数、损失函数、优化器
  • Django 表单:深度解析与最佳实践
  • 高性能分布式通信框架:eCAL 介绍与应用
  • 解锁高效开发:AWS 前端 Web 与移动应用解决方案详解
  • 区块链技术原理(2) -数据结构
  • 云平台运维工具 ——AWS 原生工具
  • 告别Cursor!最强AI编程辅助Claude Code安装到使用全流程讲解
  • MySQL面试题及详细答案 155道(061-080)
  • 【图文教程】三步用Cpolar+JuiceSSH实现手机远程连接内网Linux虚拟机
  • 平台服务器被入侵,使用WAF能防范吗?
  • 机器学习——04 逻辑回归
  • LoRaWAN的网络拓扑
  • graalvm初探
  • 急危重症专科智能体”构建新一代急诊、手术与重症中心的AI医疗方向探析
  • DBeaver 25.1.0 转储数据库失败解决方案(适配最新版界面)
  • Android Auto开发指南