计算机视觉应用开发案例教程(OpenCV)课件 第1-4章 计算机视觉与 OpenCV 入门-图像几何变换_第1页
计算机视觉应用开发案例教程(OpenCV)课件 第1-4章 计算机视觉与 OpenCV 入门-图像几何变换_第2页
计算机视觉应用开发案例教程(OpenCV)课件 第1-4章 计算机视觉与 OpenCV 入门-图像几何变换_第3页
计算机视觉应用开发案例教程(OpenCV)课件 第1-4章 计算机视觉与 OpenCV 入门-图像几何变换_第4页
计算机视觉应用开发案例教程(OpenCV)课件 第1-4章 计算机视觉与 OpenCV 入门-图像几何变换_第5页
已阅读5页,还剩538页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第1章

计算机视觉与OpenCV入门计算机视觉应用开发案例教程目录CONTENT1.1计算机视觉概述011.2OpenCV简介021.3OpenCV(Python)环境安装与配置031.4你的第一个OpenCV程序04任务实践05拓展实训06本章小结07课后习题08手机解锁时的人脸识别;在当今人工智能时代,计算机视觉技术正悄然改变着我们的生活自动驾驶汽车对路况的感知;医院里医生借助影像技术诊断疾病;引言这些场景背后都离不开计算机视觉的支撑。引言作为一款开源、高效的计算机视觉库,凭借其丰富的接口、跨平台特性和强大的功能,成为了学习和应用计算机视觉技术的重要工具。OpenCV(OpenSourceComputerVisionLibrary)引言本模块认识计算机视觉的基本概念与应用价值,了解OpenCV的发展历程和核心功能;完成Python环境下OpenCV的安装配置,并编写第一个OpenCV程序。建立对计算机视觉与OpenCV的初步认知。工作情境如果读者朋友想入门计算机视觉相关工作工作情境智能制造里的零件质检智慧城市中的安防监控完成图像的基础读写比如做图像数据处理、视觉应用开发,那OpenCV绝对是绕不开的核心工具。本模块会从你熟悉的场景(比如手机拍照的图像处理)入手,带你一步步配置环境、写出第一个OpenCV程序。不用一开始就纠结复杂技术,先把“读图、显图、存图”这些基础操作练熟,你就能慢慢明白:工作情境这些简单技能,其实正贴合当下产业对“视觉技术落地”的基础需求,为后续学更实用的本领打牢底子。1.1计算机视觉概述1.1.1计算机视觉的定义1.1.1计算机视觉的定义核心目标:让计算机具备“看懂”图像或视频的能力——就像人类通过眼睛获取视觉信息,再通过大脑处理理解场景一样,计算机通过摄像头、图像传感器等设备获取图像数据,再通过算法对数据进行分析,最终实现对场景内容的识别、检测、跟踪或分割。计算机视觉是人工智能领域的重要分支计算机视觉要解决的问题从一张照片中识别出“这是一只猫”(识别)在监控视频中找到“行人的位置”(检测)跟踪视频里“汽车的运动轨迹”(跟踪)让计算机从图像中“提取有用信息”并“做出判断”。1.1.1计算机视觉的定义1.1.2计算机视觉的典型应用场景1.1.2计算机视觉的典型应用场景•智能监控摄像头可实时检测画面中的异常行为(如打架、闯入禁区),并自动报警;•同时能通过人脸识别技术比对人员信息,协助警方追捕嫌疑人。安防监控领域计算机视觉技术已广泛应用于多个行业,以下是几个典型场景,帮助大家直观理解其价值:自动驾驶汽车通过车载摄像头、激光雷达等设备获取路况信息,计算机视觉算法可识别道路标线、行人、其他车辆、交通信号灯等,为车辆决策提供依据(如判断是否刹车、转弯)。自动驾驶领域•医生借助计算机视觉技术分析CT、MRI等医学影像,可更精准地定位肿瘤、识别病变区域,提高诊断效率和准确性;•例如,乳腺癌筛查中,计算机可辅助检测乳腺影像中的微小钙化点。医疗影像领域•手机中的“美颜相机”通过人脸关键点检测调整五官比例;•“扫码支付”通过二维码识别解析支付信息;•电商平台的“以图搜物”通过图像特征匹配找到相似商品。日常生活领域1.1.2计算机视觉的典型应用场景如图1-1所示,展示了计算机视觉在安防监控、自动驾驶、医疗病变影像识别和手机支付领域的应用场景,类似的场景不胜枚举,它们早已在不经意间嵌入了人类社会的方方面面。头脑风暴:请同学们讨论现实生活中还有哪些计算机视觉的应用场景?未来可能出现哪些应用场景?计算机视觉技术已广泛应用于多个行业,以下是几个典型场景,帮助大家直观理解其价值:拓展阅读计算机视觉在我国的发展与应用及其带来的思考近年来,我国在计算机视觉领域实现了从“跟跑”到“并跑”再到部分“领跑”的跨越式发展。以商汤科技、旷视科技、海康威视等企业为代表,我国团队在深度学习驱动的图像识别、目标检测、语义分割等核心技术上持续突破,相关算法多次在ImageNet、COCO等国际权威数据集竞赛中斩获佳绩,打破了早期国外技术垄断的局面;在国家战略与民生领域,技术落地更是成果显著——疫情期间,基于计算机视觉的“人脸识别+体温监测”设备快速部署于全国机场、车站,为精准防控提供关键支撑;智慧农业中,作物病虫害视觉识别系统帮助农户实现“精准植保”,助力乡村振兴;医疗领域,计算机辅助诊断系统可对肺部CT、眼底图像进行高效分析,让基层医院也能享受优质诊断资源;甚至在航天工程中,视觉技术还为航天器在轨故障检测、月球/火星探测车环境感知提供了技术保障。这些发展不仅彰显了我国科技自立自强的实力,更体现了“技术服务国家、惠及民生”的核心导向,让计算机视觉真正成为推动社会进步的“硬核力量”。拓展阅读计算机视觉在我国的发展与应用及其带来的思考我国计算机视觉领域的突破,离不开一代代科研工作者“敢啃硬骨头、勇攀技术高峰”的奋斗精神——从基础算法的反复迭代到应用场景的深度打磨,从实验室里的理论验证到田间地头的落地测试,每一项成果都凝聚着对国家科技发展的责任与担当。读者们通过学习,不仅要成为技术的掌握者,更要做未来科技发展的参与者:在学习计算机视觉原理与技能时,不妨多思考“这项技术能为我国哪些领域解决痛点”“如何让技术更贴合国情需求”,始终将“科技报国”的信念融入学习过程,未来用扎实的技术能力为我国人工智能产业高质量发展贡献力量。拓展阅读计算机视觉在我国的发展与应用及其带来的思考当然,在拥抱计算机视觉技术便利的同时,我们更需树立“科技向善”的底线思维。我国近年先后出台《新一代人工智能伦理规范》《数据安全法》等政策,明确要求技术发展需兼顾隐私保护、算法公平性与社会公共利益——比如人脸识别技术在便捷身份核验的同时,需防范数据泄露风险;智能监控系统在提升管理效率的同时,需避免过度监控侵犯权益。这就要求我们在学习过程中,不仅要练“技术硬功”,更要修“责任内功”:既要掌握图像处理、模型训练的专业能力,也要主动思考技术应用的伦理边界,培养“技术能力与责任担当并重”的职业素养,成长为既懂技术、又有温度的人工智能从业者,让技术始终朝着服务人类、造福社会的方向发展。1.1.3计算机视觉与数字图像处理的关系1.1.3计算机视觉与数字图像处理的关系很多同学会疑惑:计算机视觉和“数字图像处理”有什么区别?简单来说,数字图像处理是计算机视觉的基础,两者是“工具与目标”的关系:数字图像处理更侧重于“对图像本身的操作”,比如将彩色图像转为灰度图、去除图像中的噪声、增强图像对比度等,核心是“改善图像质量”或“提取图像特征”(如边缘、角点)。计算机视觉则更侧重于“对图像内容的理解”,它会利用数字图像处理得到的特征,进一步分析图像中的目标(如“这个特征对应的是人脸”“那个特征对应的是汽车”),最终实现对场景的判断。1.1.3计算机视觉与数字图像处理的关系很多同学会疑惑:计算机视觉和“数字图像处理”有什么区别?简单来说,数字图像处理是计算机视觉的基础,两者是“工具与目标”的关系:举个例子:要实现“人脸识别”,首先需要通过数字图像处理技术(如灰度化、滤波去噪)预处理人脸图像,再提取人脸的特征(如眼睛、鼻子的位置);而计算机视觉则负责利用这些特征,判断“这张人脸属于谁”,完成识别任务。1.2OpenCV简介1.2.1OpenCV的发展历程1.2.1OpenCV的发展历程OpenCV最初由英特尔公司于1999年发起开发,2000年发布第一个正式版本。经过20多年的发展,OpenCV已从最初的简单图像库,成长为支持多平台、多语言(C++、Python、Java等)、功能覆盖计算机视觉全领域的开源项目,目前由OpenCV基金会维护。OpenCV的版本迭代中,有两个重要的版本节点需要关注:OpenCV3.x系列:2015年发布,首次引入“contrib”扩展模块(包含SIFT、SURF等专利算法),同时加强了对深度学习的支持,是早期学习和应用的主流版本。OpenCV4.x系列:2018年发布,优化了代码结构,移除了部分过时接口,增强了对GPU加速的支持,同时完善了深度学习模块(如支持更多预训练模型),目前是推荐使用的版本。本书将基于OpenCV4.x版本(具体为4.12.0)进行讲解。1.2.2OpenCV的核心功能模块1.2.2OpenCV的核心功能模块OpenCV的核心模块,包含图像数据结构(如Mat类,用于存储图像像素)、基本数学运算(如矩阵操作、距离计算)等基础功能,是其他模块的依赖。1.core模块OpenCV的功能通过“模块”(Module)的形式组织,不同模块对应不同的计算机视觉任务。对于初学者,无需掌握所有模块,重点关注以下核心模块即可:图像处理模块,提供图像灰度化、二值化、滤波去噪、边缘检测、几何变换等常用操作,是数字图像处理的核心工具。2.imgproc模块高层图形用户界面模块,用于图像的读取(imread)、显示(imshow)、保存(imwrite),以及窗口、滑动条的创建,是与用户交互的关键模块。3.highgui模块特征检测与匹配模块,包含Harris角点检测、SIFT、ORB等特征提取算法,以及特征匹配相关接口,是目标识别、图像拼接的基础。4.features2d模块OpenCV的功能通过“模块”(Module)的形式组织,不同模块对应不同的计算机视觉任务。对于初学者,无需掌握所有模块,重点关注以下核心模块即可:目标检测模块,支持加载预训练的级联分类器(如人脸检测、眼睛检测模型),可快速实现常见目标的检测任务。5.objdetect模块深度学习模块,支持加载TensorFlow、PyTorch等框架训练的模型,实现图像分类、目标检测等高级任务,是OpenCV与深度学习结合的重要接口。6.dnn模块1.2.2OpenCV的核心功能模块1.2.3OpenCV的官方资源学习OpenCV过程中,官方资源是最权威的参考资料,推荐大家收藏以下资源:1.2.3OpenCV的官方资源/,网站包含版本更新、功能介绍、官方文档入口等信息,是获取OpenCV最新动态的首选渠道。如图1-2所示,为OpenCV官方网站首页界面,可清晰看到“Documentation”(文档)、“Libraries”(库下载)等核心入口。1.OpenCV官方网站:学习OpenCV过程中,官方资源是最权威的参考资料,推荐大家收藏以下资源:1.2.3OpenCV的官方资源/,文档按版本分类(如4.12.0版本文档地址为/4.12.0/),包含模块接口说明、示例代码、算法原理等,是调试代码时的重要参考。2.OpenCV官方文档:学习OpenCV过程中,官方资源是最权威的参考资料,推荐大家收藏以下资源:1.2.3OpenCV的官方资源/opencv/opencv,开源项目的代码仓库,可获取源码、提交问题反馈,也能查看其他开发者贡献的示例,如图1-3所示。3.OpenCVGitHub仓库:注意:本书附带的素材库已为读者准备好了下载好的官方资源,读者也可以自行下载最新版本。1.3OpenCV(Python)环境安装与配置OpenCV(Python)环境安装与配置要使用Python编写OpenCV程序,首先需要完成“Python环境+OpenCV库”的安装配置。本节将详细讲解安装步骤,同时提供常见故障的排查方法。1.3.1配置Python环境若未安装,可从Python官方网站(/)下载对应系统(Windows/macOS/Linux)的安装包,安装时注意勾选“AddPythontoPATH”(将Python添加到系统环境变量),如图1-4所示,方便后续通过命令行调用Python。由于本书面向人工智能技术应用专业学生,默认大家已完成Python环境的安装(推荐Python3.7~3.10版本,兼容性最佳),本书选择Python3.9.7运行环境。1.3.1配置Python环境验证Python环境的步骤如下:1.3.1配置Python环境打开系统命令行工具(Windows:按下Win+R,输入cmd回车;macOS:启动台→其他→终端;Linux:直接打开终端)。1.在命令行中输入python--version(或python3--version,部分系统需区分Python2和Python3);1.若输出类似“Python3.9.7”的版本信息,说明Python环境已安装成功,如图1-5所示;若提示“python不是内部或外部命令”,则需重新检查Python安装时是否勾选“AddPythontoPATH”,或手动配置系统环境变量。1.3.2安装OpenCV-Python库Python环境验证通过后,可通过pip工具(Python自带的包管理工具)快速安装OpenCV-Python库。pip会自动下载并安装OpenCV的核心库及依赖,无需手动配置其他环境。1.3.2安装OpenCV-Python库具体安装步骤1.打开命令行工具(cmd),输入以下安装命令:#安装OpenCV核心库(包含core、imgproc、highgui等基础模块)pipinstallopencv-python若需要使用contrib扩展模块(如SIFT算法、人脸识别相关接口),可额外安装opencv-contrib-python库,命令如下:#安装OpenCV核心库+contrib扩展模块pipinstallopencv-contrib-pythonPython环境验证通过后,可通过pip工具(Python自带的包管理工具)快速安装OpenCV-Python库。pip会自动下载并安装OpenCV的核心库及依赖,无需手动配置其他环境。1.3.2安装OpenCV-Python库具体安装步骤1.打开命令行工具(cmd),输入以下安装命令:提示:安装时建议使用国内镜像源(如阿里云、清华大学镜像),可加快下载速度,以清华大学镜像命令为例,格式为:(推荐采用此方法,如图1-6所示)#用阿里云镜像安装opencv-contrib-pythonpipinstallopencv-contrib-python-i/pypi/simple/图1-6使用国内镜像源安装带有contrib扩展模块的opencv库Python环境验证通过后,可通过pip工具(Python自带的包管理工具)快速安装OpenCV-Python库。pip会自动下载并安装OpenCV的核心库及依赖,无需手动配置其他环境。1.3.2安装OpenCV-Python库具体安装步骤2.等待安装完成:命令执行后,pip会显示下载进度(如“Downloadingopencv_python-8-cp39-cp39-win_amd64.whl(45.3MB)”),安装成功后会提示“Successfullyinstalledopencv-python-8”(版本号可能因最新版变化)。如图1-37所示,为命令行安装OpenCV-Python的成功提示界面,红框标注安装成功的信息。图1-7命令行安装OpenCV-Python的成功提示界面,红框标注安装成功的信息1.3.3验证OpenCV安装结果安装完成后,需通过Python代码验证OpenCV是否能正常导入并使用,步骤如下:1.3.3验证OpenCV安装结果1.打开命令行工具,输入python(或python3)进入Python交互式环境(界面会显示“>>>”提示符)。若输出类似“OpenCV版本:4.12.0”的信息,说明OpenCV已成功安装并可正常使用如图1-8所示;若提示“ImportError:Nomodulenamed'cv2'”,则需重新检查安装命令是否正确,或尝试重启命令行工具后再次验证。2.在交互式环境中输入以下代码:#导入OpenCV库,约定简写为cv2importcv2#打印OpenCV版本号print("OpenCV版本:",cv2.__version__)图1-8显示OpenCV版本信息,证明库已成功安装并可正常使用1.3.4常见安装故障排查1.3.4常见安装故障排查1.故障1:pip命令无法使用症状:输入pip--version提示“pip不是内部或外部命令”。排查:①检查Python安装时是否勾选“AddPythontoPATH”;②手动添加Python的“Scripts”目录到系统环境变量(Windows:Python安装路径下的“Scripts”文件夹,如“C:\Python39\Scripts”)。2.故障2:安装速度过慢或下载中断症状:pip下载时进度停滞,或提示“Readtimedout”。排查:使用国内镜像源重新安装(参考1.4.2节的镜像源命令)。1.3.4常见安装故障排查3.故障3:安装后导入cv2提示“DLLloadfailed”(Windows系统)症状:importcv2时提示“ImportError:DLLloadfailedwhileimportingcv2”。排查:①检查Python版本与OpenCV版本是否匹配(如64位Python需安装64位OpenCV);②若系统缺少“VisualC++Redistributable”组件,可从微软官网下载安装(/zh-CN/cpp/windows/latest-supported-vc-redist?view=msvc-170)。1.3.5在conda虚拟环境中配置OpenCV环境除了直接在系统Python环境中安装OpenCV,推荐使用conda虚拟环境管理OpenCV依赖。conda是一个开源的包管理与环境管理工具,通过创建独立的虚拟环境,可避免不同项目之间的库版本冲突(例如A项目需要OpenCV3.4,B项目需要OpenCV4.6),尤其适合多项目开发场景。1.3.51.前提:安装Anaconda或Minicondaconda虚拟环境依赖Anaconda或Miniconda(轻量化版本),安装步骤如下:Anaconda(包含Python及常用科学计算库):官网/download,选择对应系统(Windows/macOS/Linux)的Python3.x版本;下载安装包:Miniconda(仅包含conda和Python):官网https://docs.conda.io/en/latest/miniconda.html,选择适合的版本。(1)安装:运行安装包,Windows系统注意勾选“AddAnaconda3tomyPATHenvironmentvariable”(添加到环境变量),macOS/Linux可默认安装。(2)验证:打开命令行,输入conda--version,输出类似“conda23.1.0”说明安装成功。1.3.52.创建并激活conda虚拟环境步骤如下打开AnacondaPrompt命令行,输入以下命令创建名为“cv_env”(可自定义)的虚拟环境,指定Python版本为3.9(兼容性佳):condacreate-ncv_envpython=3.9图1-9创建虚拟环境(1)创建虚拟环境:1.3.52.创建并激活conda虚拟环境(1)创建虚拟环境:步骤如下运行后会提示安装依赖,如图1-10所示,输入“y”确认,等待环境创建完成。图1-10虚拟环境待确认界面1.3.52.创建并激活conda虚拟环境(1)创建虚拟环境:步骤如下运行后会提示安装依赖,如图1-10所示,输入“y”确认,等待环境创建完成。(2)激活虚拟环境:虚拟环境创建成功后还需输入激活命令才能成功激活虚拟环境,如图1-11所示。Windows系统:condaactivatecv_envmacOS/Linux系统:sourceactivatecv_env图1-11激活虚拟环境激活成功后,命令行提示符前会显示“(cv_env)”,表示当前处于虚拟环境中。如图1-11所示。1.3.53.在虚拟环境中安装OpenCV方法1:通过conda安装(推荐,自动解决依赖)激活“cv_env”环境后,可通过两种方式安装OpenCV#安装OpenCV核心库condainstall-cconda-forgeopencv#若需要contrib扩展模块,安装opencv-contribcondainstall-cconda-forgeopencv-contrib-cconda-forge:指定从conda-forge渠道下载(该渠道的OpenCV版本更新及时);安装过程中输入“y”确认依赖安装,等待完成。1.3.53.在虚拟环境中安装OpenCV方法2:通过pip在conda环境中安装激活“cv_env”环境后,可通过两种方式安装OpenCV#先更新pippipinstall--upgradepip#安装OpenCVpipinstallopencv-contrib-python若conda安装速度慢,可在虚拟环境中使用pip安装(需确保已激活“cv_env”):建议配合国内镜像源(如-i/simple)加速下载。1.3.54.验证conda环境中的OpenCV激活“cv_env”环境后,输入python进入Python交互式环境,执行以下代码:importcv2print("OpenCV版本:",cv2.__version__)若输出版本信息(如“4.12.0”),说明虚拟环境中的OpenCV安装成功。如图1-12所示。图1-12验证conda环境中的OpenCV1.3.55.退出与删除虚拟环境通过conda虚拟环境管理OpenCV,可有效隔离不同项目的依赖,尤其适合课程学习中需要测试不同版本库的场景。后续模块的任务,推荐在独立的conda环境中完成,避免环境冲突。退出虚拟环境:condadeactivate(命令行提示符前的“(cv_env)”消失);删除虚拟环境(谨慎操作):condaremove-ncv_env--all,输入“y”确认删除。1.4你的第一个OpenCV程序你的第一个OpenCV程序掌握环境配置后,我们来编写第一个OpenCV程序——通过该程序,你将学会如何用OpenCV读取本地图像、在窗口中显示图像,以及保存处理后的图像,这是后续所有OpenCV项目的基础操作。1.4.1程序功能与核心函数本程序的核心功能的是:读取一张本地彩色图像,在窗口中显示图像,等待用户按键后关闭窗口,并将图像保存为新文件。1.4.1程序功能与核心函数1.cv2.imread():读取本地图像——语法:cv2.imread(filename,flags)cv2.IMREAD_COLOR(默认值,可简写为1):读取彩色图像,忽略Alpha通道(透明度);cv2.IMREAD_GRAYSCALE(可简写为0):读取灰度图像;cv2.IMREAD_UNCHANGED(可简写为-1):读取完整图像,包含Alpha通道。返回值:成功读取时返回Mat类型的图像数据(可理解为存储像素的矩阵);读取失败时返回None(常见原因:路径错误、文件损坏)。参数2flags:图像读取模式,常用值:参数1filename:图像文件的路径(绝对路径或相对路径),例如“test.jpg”(相对路径,图像需与代码文件在同一目录)、“C:\images\test.jpg”(Windows绝对路径)、“/home/user/images/test.jpg”(Linux/macOS绝对路径)。实现该功能需要用到几个核心函数,其功能与参数说明如下:本程序的核心功能的是:读取一张本地彩色图像,在窗口中显示图像,等待用户按键后关闭窗口,并将图像保存为新文件。1.4.1程序功能与核心函数2.cv2.imshow():在窗口中显示图像——语法:cv2.imshow(winname,mat)注意:cv2.imshow()需配合cv2.waitKey()使用,否则窗口会一闪而过(原因:imshow()创建的窗口需要等待键盘输入才能保持显示)。返回值:用户按下的键对应的ASCII码(例如,按下“ESC”键返回27)。参数delay:等待时间(单位:毫秒),delay=0表示无限等待,直到用户按下任意键;delay>0表示等待指定毫秒后自动关闭。参数1winname:窗口名称(字符串),例如“OriginalImage”;参数2mat:要显示的图像数据(cv2.imread()的返回值)。实现该功能需要用到几个核心函数,其功能与参数说明如下:3.cv2.waitKey():等待键盘输入——语法:cv2.waitKey(delay)本程序的核心功能的是:读取一张本地彩色图像,在窗口中显示图像,等待用户按键后关闭窗口,并将图像保存为新文件。1.4.1程序功能与核心函数4.cv2.destroyAllWindows():关闭所有OpenCV创建的窗口参数2mat:要保存的图像数据;参数1filename:保存的文件名(需包含后缀,如“output.jpg”、“result.png”);语法:cv2.destroyAllWindows()作用:在程序结束前关闭所有窗口,释放内存,避免资源占用。实现该功能需要用到几个核心函数,其功能与参数说明如下:5.cv2.imwrite():保存图像到本地——语法:cv2.imwrite(filename,mat)返回值:保存成功返回True,失败返回False(常见原因:路径不存在、权限不足)。1.4.2完整代码实现1.4.2完整代码实现准备一张测试图像(推荐使用JPG或PNG格式),将图像文件与接下来要创建的Python代码文件放在同一目录下(方便使用相对路径),将图像文件命名为“test.jpg”。从硬盘读取图像文件到内存中读取模式图像路径test.jpg表示相对路径,图像需与代码文件在同一目录;cv2.IMREAD_COLOR表示读取为彩色图。第一步、第二步1.4.2完整代码实现第三步在屏幕上创建一个窗口,并将图像数据显示出来。cv2.imshow()显示的图像数据窗口的名字配合cv2.waitKey()使用1.4.2完整代码实现等待键盘输入参数是等待的毫秒数,如果设为`0`,则表示无限期等待,直到用户按下任意键。没有它,窗口会一闪而过,你根本看不清。第四步1.4.2完整代码实现将图像保存到本地保存的图像数据保存的文件名第五步1.4.2完整代码实现在程序结束前,关闭所有由OpenCV创建的窗口,释放它们占用的内存资源。第六步1.4.2完整代码实现1.4.3程序运行与结果分析1.命令行运行2.IDE运行命令行运行:按下键盘上Win+R组合键,打开“运行”对话框,输入cmd后按回车键,打开命令行,进入代码文件所在目录,输入pythonfirst_opencv.py回车;使用PyCharm、VSCode等PythonIDE打开代码文件,点击“运行”按钮。以VSCode为例,选择“Run”选项卡下的“RunWithoutDebugging”即可运行程序。1.4.3程序运行与结果分析步骤1:运行程序将上述代码保存为“first_opencv.py”,通过以下方式运行:图1-13用VSCode运行程序代码1.4.3程序运行与结果分析步骤2:观察运行结果1.若图像读取成功,会弹出一个标题为“OriginalImage”的窗口,窗口中显示“test.jpg”的彩色图像,如图1-14所示。2.此时程序处于等待状态,你可以:图1-14

“OriginalImage”窗口按下键盘上的任意键,窗口会关闭,程序结束;按下“s”键(小写),程序会将图像保存为“saved_image.jpg”,并在命令行输出“图像保存成功!”,之后关闭窗口。1.4.3程序运行与结果分析步骤3:常见运行故障排查1.故障1:弹出窗口显示“无响应”症状:运行程序后,图像窗口显示“无响应”,无法操作。解决:确保代码中包含cv2.waitKey(0),且waitKey()的参数不为0时,等待时间足够长(例如waitKey(5000)表示等待5秒);若仍无响应,可强制关闭程序后重新运行。2.故障2:提示“图像读取失败”症状:命令行输出“图像读取失败!请检查图像路径是否正确。”排查:①确认图像文件与代码文件在同一目录;②若使用绝对路径,检查路径是否正确(Windows路径需用“\”或“/”,例如“C:/images/test.jpg”);③确认图像文件未损坏(可尝试用画图工具打开图像)。1.4.4功能扩展:显示灰度图与单通道图功能扩展:显示灰度图与单通道图在上述基础上,我们可以扩展程序功能——读取彩色图像后,将其转为灰度图和单通道图(如B通道),并在不同窗口中显示,帮助大家理解OpenCV对图像通道的处理方式。显示灰度图与单通道图1.4.4扩展:显示灰度图与单通道图显示灰度图与单通道图1.4.4扩展:显示灰度图与单通道图1.4.4扩展:显示灰度图与单通道图运行代码后,会弹出3个窗口,分别显示彩色图、灰度图和B通道图,如图1-15所示。图1-15:彩色图、灰度图和B通道图任务实践任务实践为巩固本模块所学知识,请完成以下实践任务,任务难度适,参照之前的案例依葫芦画瓢即可,读者可尝试独立完成。任务实践任务一

图像的读取和显示1.准备一张包含人物或风景的彩色图像(文件名为“task.jpg”),与代码文件放在同一目录;2.编写Python代码,实现以下功能:读取“task.jpg”彩色图像;将彩色图像转为灰度图;提取彩色图像的B通道,构建仅B通道有值、G/R通道为0的图像(参考1.5.4节的cv2.merge()方法);创建3个窗口,分别显示“原图(彩色)”“灰度图”“B通道图”;等待用户按下“q”键后,保存灰度图为“task_gray.jpg”,并关闭所有窗口;3.运行代码,验证功能是否正常,并截图保存运行结果(后续可作为作业提交)。任务实践任务一

图像的读取和显示操作提示:1.构建B通道图时,需导入numpy库(importnumpyasnp),np.zeros_like(b_channel)用于创建与B通道尺寸相同的全0数组;2.判断用户按键时,使用key==ord('q'),确保按下“q”键才执行保存操作;3.若运行中遇到问题,可参考1.3节和1.4节的故障排查方法,或查阅OpenCV官方文档。拓展实训实训1图像基础属性分析与格式转换熟练获取图像的尺寸、通道数、像素类型等基础属性;1.掌握彩色图转灰度图的实现方法;2.完成图像在JPG、PNG格式间的转换,并观察文件大小差异。3.实训目标准备1张普通彩色图像(如“flower.jpg”,分辨率建议640×480左右,避免过大影响处理速度);素材方面实训准备实训1图像基础属性分析与格式转换确保Python+OpenCV环境可用(系统环境或conda虚拟环境均可);环境方面记事本或VSCode(用于编写代码)、文件管理器(查看保存后的图像文件)。工具方面实训1图像基础属性分析与格式转换①读取图像并打印属性;②

彩色图转灰度图;③

保存为不同格式并对比大小。实训步骤本次实训需完成3个核心操作:创建文件“exp1_image_basic.py”,代码如下实训1图像基础属性分析与格式转换创建文件“exp1_image_basic.py”,代码如下实训1图像基础属性分析与格式转换成功读取返回一个包含三个数字的元组uint8,范围是0到255表示从黑到白的灰度,或者每个颜色通道的强度。图像的总像素数量总像素=高度

×

宽度

×

通道数创建文件“exp1_image_basic.py”,代码如下实训1图像基础属性分析与格式转换cvtColor:颜色空间转换函数;COLOR_BGR2GRAY:从‘BGR格式’转换到‘GRAY灰度格式’;注意:OpenCV默认的彩色通道顺序是BGR(蓝-绿-红),而不是我们常见的RGB!(高度,宽度),单通道创建文件“exp1_image_basic.py”,代码如下实训1图像基础属性分析与格式转换将彩色原图保存为PNG格式PNG格式通常比JPG大创建文件“exp1_image_basic.py”,代码如下实训1图像基础属性分析与格式转换打开两个窗口程序停止按下任意键创建文件“exp1_image_basic.py”,代码如下实训1图像基础属性分析与格式转换实训1图像基础属性分析与格式转换

1.放置图像:将“flower.jpg”与代码文件放在同一文件夹;

2.运行代码:打开命令行,进入文件夹,输入pythonexp1_image_basic.py;

4.记录结果:将命令行输出的属性信息和文件大小抄录到实训报告中。

3.验证结果:命令行输出:检查是否有“图像读取成功”“保存完成”等提示,属性值是否合理(如通道数为3,灰度图通道数为1);文件生成:查看文件夹,是否新增“flower_color.png”和“flower_gray.jpg”;窗口显示:是否弹出两个窗口,分别显示彩色原图和灰度图;运行与验证实训结果与分析实训1图像基础属性分析与格式转换图1-16实验一运行结果格式差异:PNG格式因无损压缩,相同图像的文件大小通常大于JPG(有损压缩);灰度图因仅1个通道,比彩色图(3通道)的文件小约2/3;属性规律:彩色图的shape有3个值(高、宽、通道),灰度图仅2个值(高、宽);运行结果:如图1-16所示。实训2简单按键交互与图像保存掌握cv2.waitKey()的按键监听功能;1.实现“按指定键保存图像、按Q键退出”的交互逻辑;2.巩固图像显示与窗口关闭的操作。3.实训目标使用素材库的“task.jpg”。素材方面实训准备ord('键名')可获取按键的ASCII码(如ord('S')对应83,ord('q')对应113)。提前理解实训2简单按键交互与图像保存①

显示彩色原图和灰度图;②

按“S”键(大写)保存灰度图;③

按“q”键(小写)关闭窗口退出。实训步骤设计3个核心交互:实训2简单按键交互与图像保存创建文件“exp2_key_interaction.py”,代码如下图像转换为灰度图实训2简单按键交互与图像保存实训2简单按键交互与图像保存创建文件“exp2_key_interaction.py”,代码如下循

环记录‘灰度图是否已经被保存过’‘S’键按下的情况“ord('S')

用于获取大写字母‘S’的ASCII码保

存True:防止重复保存确保了灰度图只被保存一次,提升了程序的健壮性和用户体验。退出立即跳出当前的whileTrue循环实训2简单按键交互与图像保存创建文件“exp2_key_interaction.py”,代码如下释放系统资源实训2简单按键交互与图像保存创建文件“exp2_key_interaction.py”,代码如下

1.运行代码:输入pythonexp2_key_interaction.py;

2.测试交互:按“S”键:命令行显示“已保存”,查看文件夹是否新增“saved_gray.jpg”;再次按“S”键:因save_flag为True,不会重复保存(避免覆盖);按“q”键:窗口关闭,程序正常退出;

3.异常测试:若误点窗口“关闭”按钮,再按“q”键仍能退出(代码鲁棒性设计)。运行与验证实训2简单按键交互与图像保存实训结果与分析按键监听:whileTrue循环配合waitKey(100)实现“持续等待按键”,100毫秒的间隔平衡了响应速度和电脑资源占用;实训2简单按键交互与图像保存重复避免:save_flag变量确保灰度图只保存一次,避免用户误按多次导致文件重复覆盖;运行结果:如图1-17所示。本章小结本章小结本模块作为计算机视觉与OpenCV的入门内容,主要涵盖以下核心知识点:1.计算机视觉是让计算机

“看懂”

图像的技术,应用于安防、自动驾驶、医疗等多个领域,数字图像处理是其基础;2.OpenCV是开源的计算机视觉库,核心模块包括core(基础)、imgproc(图像处理)、highgui(图像显示)等,官方文档是重要学习资源;3.完成Python环境验证后,通过pipinstallopencv-python可快速安装OpenCV,安装后需通过importcv2验证;本章小结本模块作为计算机视觉与OpenCV的入门内容,主要涵盖以下核心知识点:4.第一个OpenCV程序的核心流程是“读取图像→显示图像→等待按键→保存图像→关闭窗口”,关键函数包括cv2.imread()、cv2.imshow()、cv2.waitKey()、cv2.imwrite();5.实践任务帮助大家巩固图像读取、通道处理、窗口显示与图像保存的操作,为后续模块的图像预处理、几何变换等内容打下基础。下一个模块将学习“图像的基本操作”,包括图像属性获取、像素修改、ROI提取与通道分离,进一步加深对OpenCV图像处理的理解。课后习题一、选择题课后习题1.以下代码中,能正确读取灰度图像的是(

)A.img=cv2.imread("test.jpg",1)B.img=cv2.imread("test.jpg",0)C.img=cv2.imread("test.jpg",-1)D.img=cv2.read("test.jpg",0)一、选择题课后习题2.cv2.waitKey(0)的作用是(

)A.等待0毫秒后自动关闭窗口B.无限等待,直到用户按下任意键C.关闭所有窗口D.保存当前显示的图像一、选择题课后习题3.若图像img的shape为(360,640,3),则该图像的总像素数为(

)A.360×640=230400B.360×640×3=691200C.360+640+3=1003D.640×360×3=691200(与B相同,仅顺序不同)一、选择题课后习题4.使用conda创建名为“cv_test”、Python版本为3.8的虚拟环境,命令正确的是(

)A.condacreate-ncv_testpython=3.8B.condacreatecv_testpython=3.8C.condanew-ncv_testpython=3.8D.condacreate-namecv_testpython=3.8一、选择题课后习题5.以下关于图像保存的说法,错误的是(

)A.A.cv2.imwrite()需要指定文件名(含后缀,如“a.png”)B.保存灰度图时,cv2.imwrite()会自动按单通道保存C.若保存路径不存在(如“C:/new_dir/a.jpg”,但“new_dir”未创建),cv2.imwrite()会自动创建路径并保存D.cv2.imwrite()的返回值为True表示保存成功,False表示失败二、填空题课后习题1.OpenCV中,将彩色图像(BGR通道)转为灰度图的函数是__________,对应的转换标识是__________。2.若要检查图像是否读取成功,可判断cv2.imread()的返回值是否为__________。3.关闭OpenCV创建的所有窗口的函数是__________,关闭指定名称窗口(如“GrayWindow”)的函数是__________。4.使用pip更新OpenCV库的命令是__________。第2章

图像的基本操作计算机视觉应用开发案例教程目录CONTENT2.1NumPy基础知识012.2图像属性的获取与分析022.3像素的读取与修改032.4ROI的提取与处理042.5图像通道的分离与合并05任务实践06拓展实训07本章小结08

课后习题09工作情境“拆解开图像、调整细节”工作情境质检岗要从零件图里抠出关键区域看缺陷医疗影像辅助岗要调通道亮度突出病变零售技术岗要核对商品图尺寸是否符合系统要求用NumPy教你看图像属性、改像素、提ROI、分通道,每一步都对应实际需求学会ROI提取,下次碰到“只分析图像局部”的任务就能直接上手;工作情境掌握通道调整,还能帮着优化影像显示效果。技能串起来,就是你应对“精准处理图像”需求的核心能力。2.1NumPy基础知识2.1NumPy基础知识掌握NumPy基础操作,是理解图像处理原理、高效编写代码的关键。在OpenCV中,图像数据以NumPy数组(ndarray)形式存储——彩色图像是3维数组(高度

×

宽度

×

通道数),灰度图是2维数组(高度

×

宽度)。NumPy核心数据类型2.1.1NumPy支持多种数据类型,与图像处理关联最紧密的是以下3种np.float32:32位浮点数(含小数)——用于存储归一化后的像素值,如将0-255转为0.0-1.0。32:有符号32位整数(取值范围-2³¹~2³¹-1)——用于存储图像运算中的中间结果,如梯度值;p.uint8:无符号8位整数(取值范围0-255)——图像像素的默认类型,像素亮度值0表示黑,255表示白;示例2-1:创建指定类型的NumPy数组NumPy基础简介importnumpyasnp

#导入NumPy库,约定简写为np#1.创建像素类型的数组(np.uint8)#模拟1个2×2的灰度图像素(值0-255)gray_pixels=np.array([[0,128],[192,255]],dtype=np.uint8)print("2×2灰度图像素数组:")print(gray_pixels)print("数据类型:",gray_pixels.dtype)

#输出dtype('uint8')#2.创建浮点数数组(模拟归一化像素)normalized_pixels=gray_pixels/255.0

#转为0.0-1.0print("\n归一化后的像素数组(float32):")print(normalized_pixels)print("数据类型:",normalized_pixels.dtype)

#输出dtype('float64'),可手动转为float32示例2-1:创建指定类型的NumPy数组运行结果:如图2-1所示,命令行将输出两个数组的数值及数据类型,清晰展示不同类型的应用场景。

图2-1创建指定类型的NumPy数组NumPy基础简介NumPy数组的创建2.1.2示例2-1:创建指定类型的NumPy数组NumPy基础简介如表2-1所示,图像处理中常用的数组创建方式有4种,对应不同场景,如创建全黑图像、模拟像素分布:函数功能应用场景np.array()从列表

/元组创建数组手动定义少量像素np.zeros()创建全

0数组创建全黑图像(像素值

0)np.ones()创建全

1数组生成基础模板np.arange()创建连续数值数组生成梯度像素表2-1常用的数组创建方式示例2-2:创建图像相关的NumPy数组NumPy基础简介importnumpyasnp#1.用np.zeros()创建全黑彩色图像(高度100,宽度200,3通道,uint8)#图像尺寸格式:(高度,宽度,通道数),对应OpenCV图像标准black_img=np.zeros((100,200,3),dtype=np.uint8)print("全黑彩色图像数组形状:",black_img.shape)#输出(100,200,3)print("全黑图像单个像素(BGR):",black_img[50,100])#访问并打印图像中第50行、第100列位置的

像素值;由于是全黑图像,B(蓝)、G(绿)、R(红)三个通道的值均为0,因此输出[000]#2.用np.ones()创建灰度模板(高度50,宽度50,单通道)gray_template=np.ones((50,50),dtype=np.uint8)*128#全1数组×128,像素值128(灰色)print("\n灰色模板数组形状:",gray_template.shape)#输出(50,50)print("灰色模板像素值:",gray_template[25,25])#访问并打印模板中第25行、第25列位置的像素值;由于数组所有元素均为128,因此输出128示例2-2:创建图像相关的NumPy数组NumPy基础简介#3.用np.arange()创建梯度灰度图(高度1,宽度256,单通道)gradient=np.arange(0,256,1,dtype=np.uint8).reshape(1,256)#np.arange(0,256,1)生成0到255的连续整数(步长为1),共256个值;dtype=np.uint8指定数据类型;.reshape(1,256)将一维数组重塑为1行256列的二维数组,代表高度1、宽

度256的单通道灰度图,像素值从左到右由0(黑)渐变到255(白)print("\n梯度数组形状:",gradient.shape)#输出(1,256)运行结果:如图2-2所示,命令行输出各数组的形状和关键像素值,后续可通过OpenCV显示这些数组,即图像。图2-2创建图像相关的NumPy数组NumPy数组的形状操作2.1.3查看数组形状,包含图像的高度、宽度、通道数;arr.shape修改数组形状,需保证总元素数不变;arr.reshape()NumPy基础简介数组的“形状”(shape)直接对应图像的“尺寸”,核心操作包括:删除维度为1的轴,如将(1,256)转为(256,);arr.squeeze()增加维度,如将(50,50)转为(50,50,1),单通道转3通道格式。arr.expand_dims()示例2-3:图像数组的形状修改NumPy基础简介importnumpyasnp#1.模拟灰度图像数组(200×300,单通道)gray_img=np.zeros((200,300),dtype=np.uint8)print("原始灰度图形状:",gray_img.shape)#输出(200,300)#2.用reshape()修改为1维数组(总像素数200×300=60000)gray_1d=gray_img.reshape(60000)print("1维数组形状:",gray_1d.shape)#输出(60000,)#3.用expand_dims()给灰度图加通道维度(转为3通道格式,方便与彩色图运算)gray_3ch=np.expand_dims(gray_img,axis=2)#axis=2表示在第3个维度(通道)加轴print("加通道后灰度图形状:",gray_3ch.shape)#输出(200,300,1)示例2-3:图像数组的形状修改NumPy基础简介#4.用squeeze()删除多余维度(还原为单通道)gray_back=gray_3ch.squeeze(axis=2)print("删除通道后灰度图形状:",gray_back.shape)#输出(200,300)运行结果:如图2-3所示,命令行依次输出形状修改前后的数组维度,体现“形状与图像尺寸的对应关系”。图2-3NumPy数组的形状操作NumPy数组的索引与切片2.1.42.1.4NumPy数组的索引与切片索引(取单个元素)和切片(取连续区域)是提取图像ROI(感兴趣区域)

的核心操作,规则与Python列表类似,但支持多维度操作,对应图像的“行、列、通道”。NumPy基础简介arr[行索引,列索引,通道索引](灰度图无通道索引);索引格式核心规则arr[行起始:行结束,列起始:列结束,通道起始:通道结束](冒号表示“全部”,结束索引不包含);注意:图像的“行”对应数组的第一个维度(高度),“列”对应第二个维度(宽度),与日常“宽

×

高”表述相反。切片格式示例2-4:图像数组的索引与切片(提取ROI)NumPy基础简介importnumpyasnpimportcv2#结合OpenCV显示结果#1.创建模拟彩色图像(300×400,3通道,BGR)#生成渐变背景:B通道从左到右递增,G通道从上到下递增img=np.zeros((300,400,3),dtype=np.uint8)#设置B通道(索引0对应B通道):列方向(水平方向)从左到右像素值从0递增到399#np.arange(0,400,1)生成0-399的连续整数(共400个,对应图像宽度400),形成形状为(400,)的一维数组#np.tile(...,(300,1))将一维数组重复300行(对应图像高度300),形成(300,400)的二维数组,赋值给B通道后,每个列的B值相同且从左到右递增示例2-4:图像数组的索引与切片(提取ROI)NumPy基础简介img[:,:,0]=np.tile(np.arange(0,400,1),(300,1))#B通道:列方向0-399#设置G通道(索引1对应G通道):行方向(垂直方向)从上到下像素值从0递增到299#np.arange(0,300,1)生成0-299的连续整数(共300个,对应图像高度300),形成(300,)的一维数组#.reshape(300,1)将一维数组转换为(300,1)的二维数组(300行1列)#np.tile(...,(1,400))将该数组重复400列(对应图像宽度400),形成(300,400)的二维数组,赋值给G通道后,每个行的G值相同且从上到下递增img[:,:,1]=np.tile(np.arange(0,300,1).reshape(300,1),(1,400))#G通道:行方向0-299#2.索引:取单个像素(第100行,第200列)的BGR值pixel=img[100,200]print("(100,200)像素的BGR值:",pixel)#输出[2001000](B=200,G=100,R=0)示例2-4:图像数组的索引与切片(提取ROI)NumPy基础简介#3.切片:提取ROI(第50-150行,第100-200列,全通道)#切片范围:行50≤y<150(高度100),列100≤x<200(宽度100)roi=img[50:150,100:200,:]print("ROI的形状:",roi.shape)#输出(100,100,3)#4.显示原图和ROIcv2.imshow("OriginalImage(B-GGradient)",img)cv2.imshow("ROI(50-150,100-200)",roi)cv2.waitKey(0)cv2.destroyAllWindows()示例2-4:图像数组的索引与切片(提取ROI)NumPy基础简介运行结果:如图2-4所示,弹出两个窗口,左侧为蓝绿渐变的原图,右侧为提取的100×100ROI区域;命令行输出单个像素值和ROI形状。图2-4图像数组的索引与切片(提取ROI)NumPy数组的迭代与运算2.1.5NumPy基础简介遍历图像像素是基础操作,NumPy提供两种方式:1.数组迭代(遍历像素)适合小图像,逻辑直观;基础for循环NumPy优化迭代器,适合大图像,效率更高。np.nditer()示例2-5:遍历灰度图像素并修改NumPy基础简介importnumpyasnpimportcv2#1.创建50×50的灰度图(初始值128,灰色)gray_img=np.ones((50,50),dtype=np.uint8)*128#2.方式1:for循环遍历(行→列)foryinrange(gray_img.shape[0]):#y:行索引(0-49,对应高度)forxinrange(gray_img.shape[1]):#x:列索引(0-49,对应宽度)

#左上角25×25区域像素值改为255(白色)ify<25andx<25:gray_img[y,x]=255示例2-5:遍历灰度图像素并修改NumPy基础简介#3.方式2:np.nditer()遍历(右下角25×25区域改为0(黑色))it=np.nditer(gray_img,flags=['multi_index'])#multi_index:获取当前索引whilenotit.finished:y,x=it.multi_index#当前像素的行、列索引ify>=25andx>=25:gray_img[y,x]=0it.iternext()#迭代下一个像素#4.显示结果cv2.imshow("IteratedGrayImage(White-TopLeft,Black-BottomRight)",gray_img)cv2.waitKey(0)cv2.destroyAllWindows()示例2-5:遍历灰度图像素并修改NumPy基础简介运行结果:如图2-5所示,窗口显示50×50的灰度图,左上角25×25为白色,右下角25×25为黑色,其余区域为灰色。图2-5遍历灰度图像素并修改NumPy基础简介2.数组运算(图像亮度调整、对比度调整)NumPy支持数组与标量、数组与数组的运算,直接对应图像的亮度(加常数,对像素值加正数可提升亮度,加负数则降低亮度)和对比度(乘常数,乘以大于1的数可增强对比度,乘以0到1之间的数可降低对比度,实际应用中常结合亮度补偿以避免画面整体过曝或过暗)调整,且运算速度远快于for循环。示例2-6:图像亮度与对比度调整NumPy基础简介importnumpyasnpimportcv2#1.读取灰度图像(用OpenCV读取,本身就是NumPy数组)gray_img=cv2.imread("lena_gray.jpg",cv2.IMREAD_GRAYSCALE)ifgray_imgisNone:print("图像读取失败!")else:

#2.亮度调整:所有像素加50(值需控制在0-255,避免溢出)#np.clip():将值限制在0-255,防止超过uint8范围(如250+50=300→255)#.astype(np.uint8):将运算结果转换回uint8类型(确保符合图像像素值的数据类型要求)bright_img=np.clip(gray_img+50,0,255).astype(np.uint8)示例2-6:图像亮度与对比度调整NumPy基础简介#3.对比度调整:所有像素乘1.5(增强对比度,同样需clip)contrast_img=np.clip(gray_img*1.5,0,255).astype(np.uint8)

#4.显示对比结果cv2.imshow("Ori

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论