当前位置: 首页 > 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.lryc.cn/news/612692.html

相关文章:

  • Java垃圾回收(GC)探析
  • 网络可视,运维无忧:分钟级定位,告别盲目扩容
  • 华为开源CANN,再次释放“昇腾转向”信号
  • spring boot学习计划
  • Qt: WA_DontCreateNativeAncestors
  • QT5.15 mingw
  • qt的元对象系统详解
  • B站,视频号怎么下载?,猫抓cat-catch离线版下载,Chrome扩展插件
  • 【Java】HashMap 的遍历方式有哪些?哪种更高效?
  • 什么是键值缓存?让 LLM 闪电般快速
  • OpenCV的关于图片的一些运用
  • 数据分析进阶——53页跨境数据分析【附全文阅读】
  • 僵尸进程问题排查
  • Mac+Chrome滚动截图
  • localforage的数据仓库、实例、storeName和name的概念和区别
  • OpenAI 开源模型 gpt-oss 正式上线微软 Foundry 平台
  • [Oracle] CEIL()函数
  • 利用微软SQL Server数据库管理员(SA)口令为空的攻击活动猖獗
  • MySQL中的DDL(一)
  • 直连微软,下载速度达18M/S
  • [2402MT-A] Redbag
  • 从周末去哪儿玩到决策树:机器学习算法的生活启示
  • 《深入解析缓存三大难题:穿透、雪崩、击穿及应对之道》
  • Mysql数据仓库备份脚本
  • 突破距离桎梏:5G 高清视频终端如何延伸无人机图传边界
  • 【完整源码+数据集+部署教程】无人机自然场景分割系统源码和数据集:改进yolo11-RVB
  • 计算机网络1-4:计算机网络的定义和分类
  • 【网络编程】一请求一线程
  • 云原生安全挑战与治理策略:从架构思维到落地实践
  • PyTorch + PaddlePaddle 语音识别