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

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

相关文章

物联网通讯协议-MQTT、Modbus、OPC

引言在物联网迅速发展的今天,设备间的通信协议扮演着至关重要的角色。它们是不同设备、系统之间实现数据交换的桥梁。本文将详细介绍三种在物联网领域广泛应用的通讯协议——MQTT、Modbus和OPC,包括它们的基础概念、特点及在C#中的实现方法。一、MQTT协议…

牛客周赛R104 小红的矩阵不动点

D-小红的矩阵不动点_牛客周赛 Round 104 赛时这道题卡了一段时间&#xff0c;赛时代码如下&#xff1a; #include<bits/stdc.h> using namespace std; int ans,h; int a[505][505]; signed main(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);int n,m;cin>…

Rust面试题及详细答案120道(19-26)-- 所有权与借用

《前后端面试题》专栏集合了前后端各个知识模块的面试题&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

Jenkins + SonarQube 从原理到实战三:SonarQube 打通 Windows AD(LDAP)认证与踩坑记录

前言 在前两篇文章中&#xff0c;已经介绍了 SonarQube 的部署 以及 通过 sonar-cxx 插件实现 C/C 代码扫描。 本篇将重点讲 如何让 SonarQube 对接 Windows AD&#xff08;LDAP&#xff09;&#xff0c;实现域账号登录和基于 AD 组的权限管理。 一、背景与需求分析 需求分析…

[AI React Web] 包与依赖管理 | `axios`库 | `framer-motion`库

第七章&#xff1a;包与依赖管理 在我们使用open-lovable的旅程中&#xff0c;已经探索了它如何管理对话状态&#xff08;第一章&#xff1a;对话状态管理&#xff09;、将创意转化为可运行代码&#xff08;第二章&#xff1a;AI代码生成管道&#xff09;、如何在安全的虚拟环…

PanSou 一款开源网盘搜索项目,集成前后端,一键部署,开箱即用

PanSou 网盘搜索API PanSou是一个高性能的网盘资源搜索API服务&#xff0c;支持TG搜索和自定义插件搜索。系统设计以性能和可扩展性为核心&#xff0c;支持并发搜索、结果智能排序和网盘类型分类。 项目地址&#xff1a;https://github.com/fish2018/pansou 特性&#xff08…

java爬虫实战

本人目前在做鱼皮的《智能协同云图库》&#xff0c;涉及到了以图搜图图片爬取&#xff0c;虽然以前有爬过图片&#xff0c;但是用的都是别人现成的代码&#xff0c;不怎么去理解为什么要这样做&#xff0c;这次有在尝试理解每一个步骤。本人基础极差&#xff0c;属于一点基础也…

深入详解C语言的循环结构:while循环、do-while循环、for循环,结合实例,讲透C语言的循环结构

&#x1f525;个人主页&#xff1a;艾莉丝努力练剑 ❄专栏传送门&#xff1a;《C语言》、《数据结构与算法》、C语言刷题12天IO强训、LeetCode代码强化刷题、C/C干货分享&学习过程记录 &#x1f349;学习方向&#xff1a;C/C方向 ⭐️人生格言&#xff1a;为天地立心&#…

北京-4年功能测试2年空窗-报培训班学测开-第七十四天-线下面试-聊的很满意但可能有风险-等信吧

今天没去教室&#xff0c;因为下午有个线下面试。其实是可以去教室的&#xff0c;但我实在太焦虑了&#xff0c;我觉得去了教室我心情会更不好&#xff0c;什么都干不下去&#xff0c;所以我选择不去早上依旧是带着满满焦虑起来的&#xff0c;会觉得自己的一切都不令自己满意&a…

在ubuntu服务器下安装cuda和cudnn(笔记)

目录 0 引言 1 相关环境查询 2 安装cuda 2.1 下载并安装 2.2 安装选项配置 2.3 验证安装 3 安装cudnn 3.1 下载 3.2 解压 3.3 删除旧版本 cuDNN 3.4 复制新文件到 CUDA 目录 3.5 设置文件权限 3.6 创建软链接 3.7 验证安装 0 引言 我在使用服务器的cuda11.8的时…

docker安装centos

docker库地址https://hub.docker.com/ 尝试使用centos7试了几次超时 换了个版本就可以了 docker pull centos:centos7.9.2009有时候需要更新资源地址 可以使用 vim /etc/docker/daemon.json配置其他资源地址 {"registry-mirrors": ["http://hub-mirror.c.163…

内容索引之word转md工具 - markitdown

切分文档构建RAG库过程中&#xff0c;langchain、llamaindex更期望处理latex、md类带有显式结构文档。 langchain、llamaindex切分word&#xff0c;有可能将段落中间截断&#xff0c;导致切分后的块语义不完整。 所以&#xff0c;需要先将word转化为md格式&#xff0c;然后再…

MaxKB+合合信息TextIn:通过API实现PDF扫描件的文档审核

上海合合信息科技股份有限公司&#xff08;以下简称为合合信息&#xff09;是一家深耕人工智能、OCR&#xff08;光学字符识别&#xff09;及商业大数据技术领域的科技企业。该公司拥有领先的智能文字识别技术&#xff0c;其名片全能王&#xff08;CamCard&#xff09;、扫描全…

MyBatis 核心入门:从概念到实战,一篇掌握简单增删改查

目录 一、什么是 MyBatis&#xff1f;为什么要用它&#xff1f; 二、MyBatis 核心概念&#xff08;通俗理解&#xff09; 1.SqlSessionFactory 2.SqlSession 3.Mapper接口 4.映射文件&#xff08;XML&#xff09; 三、手把手搭建第一个 MyBatis 项目 1. 准备工作 2. 核心配置文…

数据结构初阶(12)排序算法—插入排序(插入、希尔)(动图演示)

2. 常见排序算法的实现2.0 十大排序算法2.1 插入排序 2.1.1 基本思想直接插入排序是一种简单的插入排序法&#xff1a;基本思想把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中。直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。 比 挪 (…

MySQL优化常用的几个方法

本实例是对慢sql从2万优化到5千优化方法的汇总。 首先贴上优化效果&#xff1a;1、更新数据时使用ID更新&#xff1b;2、"分页/轮询"查询时先获取符合数据要求主键的最大和最小ID&#xff0c;然后WHERE条件增加ID步增查询&#xff1b;3、检查SQL是否命中WHERE条件&am…

深入解析 AUTOSAR:汽车软件开发的革命性架构

引言在汽车智能化、网联化、电动化浪潮席卷全球的今天&#xff0c;汽车电子系统的复杂性与日俱增。传统“烟囱式”的 ECU 开发模式&#xff08;各供应商独立开发软硬件&#xff09;带来了巨大的兼容性、复用性和维护成本挑战。AUTOSAR&#xff08;AUTomotive Open System ARchi…

计算机视觉(opencv)实战一——图像本质、数字矩阵、RGB + 图片基本操作(灰度、裁剪、替换等)

OpenCV 入门教程&#xff1a; OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉库&#xff0c;广泛应用于图像处理、视频分析、机器学习等领域。 在 Python 中&#xff0c;cv2 是 OpenCV 的主要接口模块。本文将带你一步步掌握 cv2…

《探索C++ set与multiset容器:深入有序唯一性集合的实现与应用》

前引&#xff1a;在STL的关联式容器中&#xff0c;set以其严格的元素唯一性和自动排序特性成为处理有序数据的核心工具。其底层基于红黑树&#xff08;Red-Black Tree&#xff09;实现&#xff0c;保证了O(log n)的查找、插入与删除复杂度&#xff01;本文将从底层原理切入&…

各测试平台功能对比分析(ITP,Postman,Apifox,MeterSphere)

对比ITP与Postman,Apifox,MeterSphere 功能特性ITPPostmanApifoxMeterSphere接口测试✅ 可视化接口调试&#xff0c;支持多种请求方式✅ 支持✅ 支持✅ 支持场景测试✅ 多接口串联测试&#xff0c;支持前后置脚本✅ Collections功能✅ 支持✅ 支持定时任务✅ 基于Celery的定时…