版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
项目二:操作图像文件基于OpenCV的图像处理入门COMPUTERVISION·计算机视觉系列课程任务导入:成为一名AI应用开发者场景设定:开发“智能相册”APP你是核心后端工程师,需要构建核心处理模块,解决以下难题:01.照片读取与显示用户上传照片后,App如何快速读取数据并渲染在界面上?02.图片智能编辑用户点击“一键黑白”,如何利用算法实时处理图片色彩?03.视频存储与管理录制视频产生的大量数据,App如何高效写入并管理文件?04.自动分类与清理自动识别并清理无效小文件,将照片按色彩属性分类存放。学习目标:掌握Python+OpenCV解决多媒体处理核心问题PROJECT:SMARTALBUMENGINEStartyourbackendjourney学习目标:知识、能力与素质知识目标◆理解核心概念:掌握数字图像在计算机中的表示方式(像素、Numpy数组)◆掌握核心函数:熟练运用OpenCV核心函数处理静态图像;理解并使用相关类处理动态视频。◆了解辅助模块:熟悉os和shutil模块在文件与目录操作中的应用。能力目标◆独立编程实现:编写程序完成图像的读取、显示、保存和简单交互;实现从摄像头捕获视频并保存。◆批量处理能力:能够编写脚本对指定目录下的图像文件进行批量筛选、删除和分类,提升工作效率。素质目标◆培养规范意识:养成良好的代码书写风格和规范的注释习惯,提升代码可读性。◆提升调试能力:学会分析并解决路径错误、文件格式不兼容等常见的开发问题。◆建立工程思维:能够将实际需求转化为可行的编程解决方案,培养解决问题的逻辑思维。第一部分:静态图像的读取、显示与存储▍核心函数概览:OpenCV图像处理基础链cv2.imread()·读取图像功能:从指定路径加载图像文件到内存,构建多维数组。关键参数:filepath(路径),flags(读取方式:彩色/灰度/原图)cv2.imshow()·显示图像功能:创建一个窗口并在其中渲染显示已加载的图像数组。关键参数:winname(窗口名),img(待显示的图像数组)cv2.waitKey()·等待交互功能:暂停程序,等待用户按键输入,决定程序下一步走向。关键参数:delay(等待毫秒数,0代表无限期等待)cv2.imwrite()·保存图像功能:将内存中处理后的图像数组,持久化写入磁盘文件。关键参数:filepath(保存路径),img(待写入的图像数组)💡标准流程:imread()(读取)→imshow()(显示)→waitKey()(等待交互)→imwrite()(保存)计算机视觉ComputerVision项目二:操作图像文件任务实现:读取并显示图像💻参考代码(Python+OpenCV)importcv2importos#拼接跨平台兼容的文件路径current_dir=os.path.dirname(os.path.abspath(__file__))img_path=os.path.join(current_dir,'cvpicture','HappyFish.jpg')#1.读取彩色图像img=cv2.imread(img_path,cv2.IMREAD_COLOR)#检查图像是否成功加载(健壮性检查)ifimgisNone:print(f"错误:无法加载图像{img_path}")else:#2.创建可调整大小的窗口dWindow("HappyFish",cv2.WINDOW_NORMAL)#3.显示图像cv2.imshow("HappyFish",img)#4.等待按键(0=无限等待)cv2.waitKey(0)#5.清理资源cv2.destroyAllWindows()任务描述编写程序,读取项目目录下cvpicture文件夹中的HappyFish.jpg图像文件,并将其在一个可调整大小的窗口中展示出来。路径处理使用os.path拼接路径,可避免不同操作系统的路径分隔符差异导致的报错。健壮性检查必须判断img是否为None,以处理文件不存在或损坏的情况。任务实现:保存图像任务描述将上一个任务中成功读取的图像数据,以BMP格式另存到本地计算机的D盘根目录下,并重命名为HappyFish_Copy。代码核心解析●核心函数:使用cv2.imwrite()函数完成保存。保存的格式由文件名后缀决定(如.bmp,.png)。●状态反馈:函数返回一个布尔值(True/False),用于判断保存是否成功,便于进行后续的错误处理逻辑。●路径处理:在Windows系统中,路径分隔符使用双反斜杠\\或在字符串前加r定义为原始字符串。Python实现代码#导入库与读取图片importcv2,osimg=cv2.imread(os.path.join(os.path.dirname(__file__),'cvpicture/HappyFish.jpg'))ifimgisnotNone:save_path=r"D:\HappyFish_Copy.bmp"is_saved=cv2.imwrite(save_path,img)print("保存成功!"ifis_savedelse"保存失败,请检查路径权限。")else:print("错误:图片加载失败!")任务实现:交互式显示(进阶)任务目标编写程序读取图片,若在3秒内按下“1”键则显示图片的灰度版本;若超时或按下其他按键,则显示原始的彩色版本。#1.等待3秒并获取用户按键key=cv2.waitKey(3000)&0xFF#2.根据按键逻辑判断显示模式ifkey==ord('1'):img=cv2.imread(path,cv2.IMREAD_GRAYSCALE)print("显示灰度图像")else:img=cv2.imread(path,cv2.IMREAD_COLOR)print("显示彩色图像")按下“1”键→灰度图程序运行窗口界面💡核心知识点•cv2.waitKey(delay):参数为等待时间(毫秒),若在时间内按下键则返回该键的ASCII码,否则返回-1。•ord('1'):将字符转换为对应的ASCII码值,用于和waitKey的返回值进行比较,实现按键逻辑判断。知识拓展:获取图像属性图像在内存中是以numpy.ndarray的形式存在的,我们可以通过访问其属性快速获取图像的关键维度、像素与类型信息。img.shape|获取维度元组彩色图返回(高,宽,3);灰度图返回(高,宽)。
例:(194,259,3)或(194,259)img.ndim|获取维度数量返回一个整数,表示图像的维度数。
例:彩色图为3,灰度图为2img.size|获取总像素数即所有维度元素的乘积,代表图像像素总量。
例:194×259×3=149,958个像素img.dtype|获取数据类型通常为8位无符号整数,表示像素值范围为0-255。
例:dtype('uint8')>>>importcv2;img=cv2.imread('HappyFish.jpg')>>>print(f"Shape:{img.shape},Size:{img.size},Dtype:{img.dtype}")Shape:(194,259,3),Size:149958,Dtype:uint8第二部分:动态图像(视频)的处理▍知识准备:视频处理基础视频本质上是一系列连续的图像(称为帧(Frame))以一定的速率(称为帧率(FPS))播放。在OpenCV中,我们主要通过以下两个核心类来实现对视频流的完整生命周期管理:cv2.VideoCapture·视频读取与捕获用于从摄像头设备(通过设备ID,通常从0开始)或本地视频文件(通过文件路径)中读取视频帧,构建视频流输入管道。cap=cv2.VideoCapture(0)|cap.isOpened()
ret,frame=cap.read()|cap.release()cv2.VideoWriter·视频编码与保存将处理后的图像帧序列,按照指定的编码格式(FourCC)、帧率和分辨率,编码并写入生成新的视频文件。fourcc=cv2.VideoWriter_fourcc(*'XVID')
out=cv2.VideoWriter('out.avi',fourcc,20.0,(640,480))任务实现:录制摄像头视频任务核心目标调用电脑默认摄像头,实时渲染并展示捕获的画面。同时将每一帧画面编码并写入本地文件`output.avi`中,直到用户按下键盘上的ESC键,程序才停止录制并退出。#PythonImplementation(OpenCV)importcv2cap=cv2.VideoCapture(0)#初始化捕获ifnotcap.isOpened():exit()#获取参数并初始化视频写入器w,h=int(cap.get(3)),int(cap.get(4))out=cv2.VideoWriter('out.avi',cv2.VideoWriter_fourcc(*'XVID'),20.0,(w,h))#循环录制直到按下ESCwhilecap.isOpened():ret,frame=cap.read()ifret:out.write(frame)cv2.imshow('LiveFeed',frame)ifcv2.waitKey(1)&0xFF==27:breakcap.release()#释放资源out.release()cv2.destroyAllWindows()关键执行流程解析①初始化:使用`VideoCapture(0)`连接硬件,确认设备就绪。
②编码:设定视频编码格式(FourCC)及帧率,创建文件写入流。
③清理:程序结束时必须释放`cap`和`out`资源,避免内存泄漏。任务实现:批量定时录制视频任务目标循环录制5个视频,每个视频固定时长10秒,并自动以当前系统的时间戳(精确到秒)作为文件名进行保存,避免文件重名覆盖。importcv2,time,os#初始化摄像头(放在循环外提升性能)cap=cv2.VideoCapture(0)fps,w,h=20,int(cap.get(3)),int(cap.get(4))foriinrange(5):#录制5次循环ts=time.strftime('%Y%m%d_%H%M%S')#获取时间戳out=cv2.VideoWriter(f'{ts}.avi',cv2.VideoWriter_fourcc(*'XVID'),fps,(w,h))start=time.time()#记录开始时刻whilecap.isOpened()andtime.time()-start<10:#录制10秒_,frame=cap.read()if_:out.write(frame)#释放资源,程序结束cap.release();cv2.destroyAllWindows()文件生成效果预览📌关键提示:1.VideoCapture在循环外初始化,避免重复开启/关闭摄像头。2.VideoWriter放在循环内,每次生成新对象对应不同文件。3.使用time.time()计算时长,比计数帧更精准。第三部分:图像文件的批量整理📚知识准备:Python文件操作基础os模块Python内置的操作系统接口,是管理文件与目录的核心工具。●os.walk(path):递归遍历指定目录下的所有文件与子目录。●os.path.join(...):跨平台安全拼接路径与文件名,避免手动拼接出错。●os.remove(file):删除指定路径的文件,用于清理冗余图像。shutil模块提供比os模块更高级、更便捷的文件操作功能,专注于文件的复制与移动。●shutil.copy(src,dst):
将文件从源路径src复制到目标路径dst。在整理图片时,可将符合条件的图片批量归档。●shutil.move(src,dst):
将文件从一个位置移动到另一个位置,常用于重分类。异常处理批量处理成百上千张图片时,为防止程序遇到单个错误就崩溃,必须引入防御机制。●try...except:捕获并处理运行时错误(如:文件权限不足、路径不存在、图片文件损坏等),确保程序能继续处理下一个文件。💡关键作用:让脚本具备“健壮性”,避免“一颗老鼠屎坏了一锅汤”。任务实现:删除非图像文件与小尺寸图片任务一:清理非媒体格式文件遍历`cvpicture`目录下的所有文件,检查文件扩展名,仅保留常见图像和视频格式文件,删除其余类型文件。importosALLOWED_EXTENSIONS={'.png','.jpg','.jpeg','.bmp','.avi'}root_dir=os.path.join(os.path.dirname(os.path.abspath(__file__)),'cvpicture')fordirpath,_,filenamesinos.walk(root_dir):forfinfilenames:ext=os.path.splitext(f)[1].lower()ifextnotinALLOWED_EXTENSIONS:os.remove(os.path.join(dirpath,f))任务二:过滤低像素图片文件读取目录中的图像文件,计算总像素数,删除像素总数小于40,000的小尺寸图片,防止处理无效素材。importos,cv2PIXEL_THRESHOLD=40000root_dir=os.path.join(os.path.dirname(os.path.abspath(__file__)),'cvpicture')fordirpath,_,filenamesinos.walk(root_dir):forfinfilenames:p=os.path.join(dirpath,f)img=cv2.imread(p)ifimgisnotNoneandimg.size<PIXEL_THRESHOLD:os.remove(p)任务实现:分类灰度与彩色图片任务描述编写脚本自动遍历cvpicture目录下的所有图片文件,判断其色彩模式,并将灰度图移动至graypicture文件夹,彩色图移动至colorpicture文件夹。importos,cv2,shutilsrc,gray_dst,color_dst="cvpicture","graypicture","colorpicture"#遍历源目录中的所有文件forfilenameinos.listdir(src):path=os.path.join(src,filename)img=cv2.imread(path,cv2.IMREAD_UNCHANGED)ifimg.ndim==2:#灰度图维度为2,彩色图通常为3shutil.copy(path,os.path.join(gray_dst,filename))else:shutil.copy(path,os.path.join(color_dst,filename))核心逻辑解析利用OpenCV的imread读取图片,通过判断img.ndim(数组维度)属性进行分类:•维度=2→灰度图(GrayScale)
•维度=3→彩色图(ColorImage)项目总结静态图像操作(读取/显示/存储)核心函数:imread()·imshow()·imwrite()·waitKey()动态视频处理(读取/写入/释放)关键类:VideoCapture()·VideoWriter()批量文件操作(遍历/复制/移动/删除)核心模块:os.walk()·shutil.copy()·os.makedirs()开发辅助模块(时间戳/健
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年文秘类事业编考试试卷及解析
- 2026年环境监测治理能力测试及解析
- 高中地理教资最后一套试卷及解析
- 初中地理教资考前押题试卷及解析
- 2026年中学地理考试冲刺押题试卷及解析
- 系统集成项目管理工程师综合练习(无水印高清)
- 焊条电弧焊历年真题(PDF高清版)
- 专升本计算机历年真题(押题版)
- 中考试题及答案解题方法
- 医学骨科创伤的急救处理
- 2026年驾驶理论复习考试试题及答案
- 2026年低压电工证考试试题及答案(共七套)
- 小学数学人教版(新教材)五年级上观察简单组合体课件(共27张)
- 2026中陕核工业集团陕西二一〇研究所有限公司社会人才及应届毕业生招聘考试备考题库及答案详解
- 2026人教版六年级数学上册活动课《体育中的数学》教案
- GB/T 35697-2026架空输电线路在线监测装置通用技术规范
- 《功能和机械能》-全国初中物理竞赛(八年级下)(原卷版+解析)
- 2026七年级数学上册第一二三单元第一次月考含答案及解析
- 2026年设备监理师之质量投资进度控制真题【网校专用】附答案详解
- 蛛网膜下腔出血的急救护理
- 2026年种子检验员高级技师考试题库
评论
0/150
提交评论