在计算机视觉的广袤领域中,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.pswp.cn/bicheng/92481.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/92481.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/92481.shtml

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

相关文章

Centos6停止服务后yum改用阿里云

环境: OS:Centos 6.9 1.进入到yum配置目录 cd /etc/yum.repos.d 2.备份 cp CentOS-Base.repo CentOS-Base.repo.bk 3.下载 wget -O CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-6.repo 问题1: 因为Centos-6早就停止了更新维护,阿里云镜像网站将其仓库…

putty+Xming(XLaunch) 远程登录VirtualBox中的Ubuntu24.04,显示图形化(GUI)界面

测试环境:VirtualBox 7,Ubuntu24.04 desktop,Ubuntu24.04 Server(no desktop),均测试成功。 一、先测试putty远程登录VirtualBox中的Ubuntu,可以使用ssh、Telnet 等协议。参见拙文《ssh连接VirtualBox中的Ubuntu24.04(win11、put…

SpringBoot微头条实战项目

一、项目概述 微头条是一个基于现代技术栈构建的新闻发布和浏览平台,旨在为用户提供便捷的新闻阅读体验和高效的新闻管理功能。该项目通过前后端分离的架构设计,实现了用户注册、登录、新闻浏览、搜索、发布、修改和删除等功能,同时通过JWT技…

如何给电脑换个ip地址?电脑换ip几种方法

更换电脑的IP地址的方法取决于你的具体需求和网络环境(是换本地局域网IP还是换对外公网IP)。以下是几种常见的方法: 一、更换本地局域网IP地址(在同一个网络内) 这个IP地址通常由你的路由器(或公司的网络管…

Pytest项目_day04(Python做接口请求)

Requests包 在python中,可以使用requests包,用于做接口请求和接口测试request支持http和https简单的get函数调用如下:r.jsonr.status_coder.textget函数的带params用法post函数的带params用法 post也可以和get一样在url中传入参数在requests包…

Flink与Kafka核心源码详解-目录

Flink是Apache软件基金会下开源的分布式流批一体计算框架,具备实时流计算和高吞吐批处理计算的大数据计算能力。本专栏内容为Flink源码解析的记录与分享。 本文解析的Flink源码版本为:flink-1.19.0 以下为Flink-1.19.0-完整源码详解的目录导航。 Flink-…

【VLLM篇】:原理-实现

1、VLLM vLLM是一个建立在【PagedAttention】之上的高吞吐的【分布式服务引擎】,目标是【提高吞吐量】、【提高内存利用率】(kv-cache内存利用率高达96%),它的内存管理分配方式从【固定分配】改进为【分页管理】,类似操…

什么是 TcpCommunicationSpi

&#x1f9e9; 一、核心定位&#xff1a;什么是 TcpCommunicationSpi&#xff1f; /*** <tt>TcpCommunicationSpi</tt> is default communication SPI which uses* TCP/IP protocol and Java NIO to communicate with other nodes.*/翻译&#xff1a;TcpCommunicat…

【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 词云图-微博评论用户词云图实现

大家好&#xff0c;我是java1234_小锋老师&#xff0c;最近写了一套【NLP舆情分析】基于python微博舆情分析可视化系统(flaskpandasecharts)视频教程&#xff0c;持续更新中&#xff0c;计划月底更新完&#xff0c;感谢支持。今天讲解词云图-微博评论用户词云图实现 视频在线地…

数据结构----栈和队列认识

目录 栈&#xff08;后进先出&#xff09; 栈的实现 头文件 初始化 入栈 注意&#xff1a; bool 判空 出栈----栈顶 注意 出栈顶元素&#xff0c;元素不会删除 注意&#xff1a; 获取栈中有效个数 销毁栈 源文件操作 用栈实现递归* 队列&#xff08;先进先出&a…

【Kafka系列】第二篇| Kafka 的核心概念、架构设计、底层原理

在大数据和分布式系统飞速发展的今天&#xff0c;消息队列作为高效的通信工具&#xff0c;在系统解耦、异步通信、流量削峰等方面作用显著。 而 Kafka 这款高性能、高吞吐量的分布式消息队列&#xff0c;在日志收集、数据传输、实时计算等场景中应用广泛。 接下来&#xff0c;我…

Kafka-exporter采集参数调整方案

#作者&#xff1a;张桐瑞 文章目录1 问题概述2 修改方案2.1修改参数2.2配置示例3 消费者组均分脚本3.1使用说明3.2脚本内容3.3实现原理说明4 KAFKA-EXPORTER流程代码4.1KAFKA-EXPORTER拉取数据流程1 问题概述 由于kafka-exporter获取kafka指标时间过长&#xff0c;无法通过cur…

AT32的freertos下modbus TCP移植

1.准备模板 打开雅特力官网&#xff0c;也就是带有LwIP的示例。 下载官方源码&#xff1a;modbus 2.移植 我这里是在这里新建两个文件夹&#xff0c;分别是modbus与port&#xff0c;这个任意&#xff0c;只需要将必要的文件加入项目即可。 将源码中的modbus这些都移植过来&a…

Redis面试精讲 Day 16:Redis性能监控与分析工具

【Redis面试精讲 Day 16】Redis性能监控与分析工具 开篇 欢迎来到"Redis面试精讲"系列第16天&#xff0c;今天我们将深入探讨Redis性能监控与分析工具。在大型分布式系统中&#xff0c;Redis作为关键的数据存储和缓存组件&#xff0c;其性能指标直接影响整个系统的…

vue3+vue-flow制作简单可拖拽可增删改流程图

实现效果实现代码 准备工作 安装依赖 npm install vue-flow/core npm install vue-flow/minimap //小地图 npm install vue-flow/controls //自带的缩放、居中、加锁功能我这里只用到上述三个&#xff0c;还有其余的可根据实际情况配合官方文档使用。 npm install vue-flow/bac…

itextPdf获取pdf文件宽高不准确

正常情况下我们通过下面方式获取宽高PdfReader reader new PdfReader(file.getPath()); float width reader.getPageSize(1).getWidth(); float height reader.getPageSize(1).getHeight();但是这样获取的宽高是不准确的&#xff0c;永远都是 宽 > 高&#xff0c;也就是横…

NodeJs学习日志(2):windows安装使用node.js 安装express,suquelize,mysql,nodemon

windows安装使用node.js 安装express&#xff0c;suquelize&#xff0c;mysql&#xff0c;nodemon 系统是win10&#xff0c;默认已经安装好nodejs与npm包名作用expressWeb应用框架suquelize数据库ORMmysql数据库nodemon代码热重载安装express 添加express生成器 npm add expres…

VueCropper 图片裁剪组件在Vue项目中的实践应用

VueCropper 图片裁剪组件在Vue项目中的实践应用 1. 组件介绍 VueCropper 是一个基于 Vue.js 的图片裁剪组件&#xff0c;它提供了丰富的图片裁剪功能&#xff0c;包括&#xff1a; 图片缩放、旋转、移动固定比例裁剪高质量图片输出多种裁剪模式选择 2. 安装与引入 首先需要安装…

给同一个wordpress网站绑定多个域名的实现方法

在WordPress网站上绑定多个域名&#xff0c;可以通过以下几种方法实现&#xff1a; 1. 修改wp-config.php文件 在wp-config.php文件中&#xff0c;找到define(‘WP_DEBUG’, false);&#xff0c;在其下方添加以下代码&#xff1a; define(WP_SITEURL, http:// . $_SERVER[HT…

HarmonyOS分布式开发实战:打造跨设备协同应用

&#x1f4d6; 文章目录 第一章&#xff1a;HarmonyOS分布式架构揭秘第二章&#xff1a;跨设备协同的核心技术第三章&#xff1a;开发环境搭建与配置第四章&#xff1a;实战项目&#xff1a;智能家居控制系统第五章&#xff1a;数据同步与状态管理第六章&#xff1a;性能优化与…