
简介包含浙江大学2020-2021学年秋冬学期计算机视觉课程完整实验与复习材料涵盖HW1HW5系列共6次实验任务HW1制作无声小短片视频HW2圆形/直线检测HW3Harris角点检测HW4Eigenface人脸检测HW5为CNN图像分类实验外附OpenCV学习资料、复习文档与模型权重。资源共1319个文件以436张jpg图像、419个txt说明、400个pgm灰度图为主另含pdf讲义、py脚本、html页面、json配置及checkpoint权重文件压缩包总大小72.75MB。已有328人学习适合正在修读计算机视觉课程的学生、备考复习者及OpenCV初学者。既可对照实验要求逐步复现也可直接参考Eigenface、CNN模型实现完成作业复习阶段还能借助讲义与笔记快速梳理考点。1. 课程资料到底值钱在哪先看清这6次实验的全貌计算机视觉这门课说难不难说简单也真不简单。浙江大学2020-2021秋冬学期的这门Computer-Vision课程我完整跟下来最大的感受是这门课真正拉开差距的从来不是考试而是那6次实验。实验做得扎实考试复习起来就是顺水推舟实验靠抄靠混期末复习等于从零开始。这套资料的核心价值不在于它是什么官方出品而在于它把整个学期的学习链路完整串起来了从OpenCV环境搭建、图像基础操作到特征提取、相机标定、目标检测再到最后的综合项目基本覆盖了计算机视觉入门阶段最经典、最常用的技术栈。而且它同时包含实验代码、复习资料和OpenCV学习笔记相当于课程、练习、考试三件套一次配齐。对正在上这门课的同学来说是直接可用的作业参考和备考提纲对自学的朋友来说则是一条被验证过的学习路径——照着这个顺序学效率比漫无目的地刷OpenCV文档高得多。我当时拿到的资料里6次实验分别涉及图像增强与直方图处理、边缘检测与轮廓提取、图像分割与形态学操作、特征点检测与匹配、相机标定与畸变校正、以及一个综合性的目标检测或人脸识别任务。每一项都是计算机视觉里绕不开的基础能力放到工业界也照样用得上。很多同学做完实验就扔一边其实很可惜——这些实验题的思路和真实项目里遇到问题时的解决套路是一模一样的只是规模小一点而已。2. 环境搭建是第一个分水岭OpenCV装不好后面全白搭2.1 选Python还是C你先想清楚这件事很多同学一上来就被OpenCV的安装劝退了其实问题往往不是安装本身而是没想清楚自己到底要用Python还是C。这门课的实验用Python写是最省事的代码量少、调试方便、OpenCV的Python接口跟C几乎一一对应抄作业也好抄。但如果你以后打算搞工业部署、做嵌入式或者跑实时视频处理C版本的价值就体现出来了性能差距在树莓派或者手机端尤其明显。我的建议是课程实验阶段老老实实用Python复习和项目扩展时再补C的API差异。Python帮你快速验证思路C帮你理解底层资源管理两者不冲突。热词里有人在问“c opencv findcontours”和“c opencv drawcontour和fillpoly”说明C版的实验也确实是很多学校的标配。我后面讲具体实验时会同时标注两边的API名称方便两边都用的同学对照着看。2.2 安装OpenCV最容易翻车的三个坑安装OpenCV这事说简单就是pip install opencv-python一条命令但实际操作中我见过太多人在这栽跟头。第一个坑是装错了包。opencv-python和opencv-contrib-python是两个不同的包前者只有核心模块后者额外包含SIFT、SURF等需要专利授权的算法模块。如果你要做特征点检测实验光装核心版很可能会在cv2.SIFT_create()这一步直接报错。所以建议一步到位装contrib版pip install opencv-contrib-python第二个坑是Anaconda环境下装混了。如果你用Anaconda管理环境千万别在base环境里直接pip装最好先建一个虚拟环境再装否则以后装别的包很容易把OpenCV的依赖搞得一团乱麻。我自己吃过这个亏最后是把整个环境删了重来才解决。第三个坑是版本兼容性问题。热词里有modulenotfounderror: no module named opencv这种报错一看就知道是import语句写错了。OpenCV的Python模块名是cv2不是opencv这俩差了十万八千里。正确写法是import cv2 print(cv2.__version__)如果能正常输出版本号比如4.5.5说明安装成功了。如果还是报错依次检查Python位数是否匹配、pip路径是否对、虚拟环境是否激活90%的问题都出在这三个环节里。2.3 其他平台和语言的情况热词里有人问树莓派安装OpenCV、VS2013导入OpenCV、Android集成OpenCV、还有C#的OpenCVSharp这些我多少都踩过一点。树莓派上最推荐用预编译的wheel包或者直接apt安装python3-opencv自己编译源码真的会等到怀疑人生一个晚上就这么没了。VS2013那个年代的配置相对麻烦要手动配置包含目录、库目录和附加依赖项本质上就是把OpenCV的路径告诉编译器现在新版本的VS配合vcpkg已经方便很多。OpenCVSharp是C#生态里比较成熟的OpenCV封装Windows桌面应用集成很方便但资料相对Python/C少很多遇到问题调试起来比较痛苦。Android那边官方有OpenCV Android SDK直接导入aar包就行。说实话如果不是被技术栈绑定学OpenCV还是建议先把Python玩熟这是性价比最高的路线。3. 6次实验核心解析与实操要点每一步该怎么做、该注意什么3.1 实验一图像增强与直方图处理——打好基础的第一关第一次实验通常不会太难核心是让你掌握图像的读取、显示、保存以及基本的像素操作和直方图均衡化。这里最值得深挖的是直方图均衡化的原理它本质上是把灰度分布拉伸到尽可能均匀让图像对比度提升。OpenCV里一条cv2.equalizeHist()就能搞定但考试和实验报告里常常会让你手动实现一遍这时候就要理解累积分布函数CDF的作用而不是只调API。实操时有两个细节容易忽略。一是如果图像是彩色的不能直接在三个通道上分别做均衡化那样会导致颜色失真正确做法是先转到YCrCb颜色空间只对亮度通道Y做均衡化。二是如果图像整体偏暗或者偏亮均衡化效果会很惊艳但如果图像本身对比度还行均衡化反而会让画面发灰这时候可以改用自适应的CLAHE算法cv2.createCLAHE()效果更自然。这个实验虽然简单但一定要自己手写一遍均衡化公式别直接调API交差。后面相机标定实验里对图像质量的判断、特征检测实验里对光照变化的预处理全都依赖这里的功底。3.2 实验二边缘检测与轮廓提取——从图像到几何的关键一步第二个实验开始进入计算机视觉的核心领域了。Canny边缘检测几乎是必考的它的流程是高斯模糊降噪、计算梯度幅值和方向、非极大值抑制、双阈值检测和滞后连接。OpenCV里一条cv2.Canny()了事但实验报告里通常要求你理解每个步骤的意义。做完边缘检测后紧接着就是轮廓提取热词里被问烂的cv2.findContours()就在这里登场。这里有个大坑不同版本的OpenCV返回值数量不一样。OpenCV 3.x和4.x的findContours返回两个值contours, hierarchy cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)而OpenCV 2.x返回三个值。如果你在网上找的旧教程代码很可能直接报错。另外findContours处理的图像必须是二值图输入灰度图或者彩色图不会报错但结果会很奇怪。轮廓提取后通常要配合cv2.drawContours()和cv2.fillPoly()来可视化结果C里这两个函数的用法跟Python略有不同主要是参数传引用的问题但这个实验我用Python一把梭就完事了C版本留给后续需要再补。3.3 实验三图像分割与形态学操作——处理噪点和连通域的利器图像分割实验常用Otsu阈值法、连通域分析、形态学腐蚀膨胀这些手段。Otsu的核心理念是自动寻找一个阈值让前景和背景的类间方差最大。OpenCV里cv2.threshold()传入cv2.THRESH_OTSU标志就能自动算非常方便。形态学操作里的腐蚀和膨胀很多人理解成“瘦一圈”和“胖一圈”这个类比不准确但很贴近直觉。实际操作中它们最常用的场景是去噪点和连接断裂区域先腐蚀去掉小噪点再膨胀恢复主体大小这个组合叫开运算反过来先膨胀后腐蚀叫闭运算用来填充小空洞。cv2.morphologyEx()可以一步完成。做分割实验最容易遇到的问题就是背景光照不均匀全局阈值怎么选都分不干净。这时候有两个思路一是用自适应阈值cv2.adaptiveThreshold()它会在局部计算阈值对光照渐变很有效二是用分水岭算法或者GrabCut这类基于区域的方法。这个实验做完你对“二值化不是万能的但要会调参”这句话会有非常切身的体会。3.4 实验四特征点检测与匹配——从SIFT到FLANN的完整流程特征点检测实验是整门课程里我觉得最有意思的一次。SIFT尺度不变特征变换虽然申请过专利但在OpenCV contrib版里依然能用。检测特征点只是第一步完整的特征匹配流程包括用SIFT或ORB提取关键点和描述子、用暴力匹配器BFMatcher或FLANN匹配器进行匹配、用比率测试剔除误匹配、最后用RANSAC计算单应性矩阵。这里有一个很典型的调参陷阱FLANN匹配器的参数对特征类型很敏感比如SIFT要用KDTree索引ORB要用LSH索引搞错了直接报错或者匹配结果惨不忍睹。实用经验是特征点数量不要贪多一般设置2000到5000就够用了太多了不仅慢误匹配也会变多。RANSAC阈值也是调出来的太小会把正确的匹配也剔掉太大会混入错误匹配。我自己在这个实验上踩过最深的坑是把SIFT和ORB的描述子混在一起匹配结果cv2.BFMatcher()报类型不匹配。描述子必须来自同一个特征提取算法才能匹配这个逻辑听起来是废话但真的会有人犯。3.5 实验五相机标定与畸变校正——棋盘格标定的完整流程相机标定是实验里最“工程化”的一次热词里“opencv棋盘格标定的c代码”被搜了很多次说明这是硬骨头。标定的目的是求相机内参矩阵和畸变系数流程大体是准备棋盘格图像、用cv2.findChessboardCorners()找到角点、用cv2.calibrateCamera()计算参数、然后用cv2.undistort()校正畸变。这个实验的成败很大程度上取决于采集的图像质量。我自己的经验是至少拍10到15张不同角度的棋盘格照片角度变化要足够大尤其是边缘部分否则标定出来的参数畸变严重的区域校正效果很差。还有一个小技巧是棋盘格尽量占画面的一半以上太小了角点检测容易失败。findChessboardCorners找不到角点是非常常见的坑解决办法通常是把图像转灰度、调对比度、或者换更大的棋盘格。OpenCV里还有一个cv2.checkChessboard()函数可以快速判断图像里有没有完整的棋盘格用来过滤无效图像很有用。标定完成后一定要看重投影误差reprojection error一般小于0.5像素就说明结果靠谱大于1像素就得重新拍图了。实验报告里写清楚每一步中间结果分数通常不会低。3.6 实验六综合项目——从人脸识别到目标检测实操最后一次实验一般是一个综合性项目人脸检测是最常见的选题因为OpenCV自带的Haar级联分类器用起来实在太方便了face_cascade cv2.CascadeClassifier(cv2.data.haarcascades haarcascade_frontalface_default.xml) faces face_cascade.detectMultiScale(gray, scaleFactor1.1, minNeighbors5, minSize(30, 30))detectMultiScale里有几个关键参数直接影响检测效果。scaleFactor是每次缩放图像的比例越接近1检测越慢但更准minNeighbors是每个候选矩形需要保留的邻居数量调大可以减少误检但也会漏检minSize用于过滤太小的检测框。这三个参数需要根据实际场景去调没有万能组合。如果你想在综合项目里拿高分光做人脸检测肯定不够建议叠加一些自己的东西。我当时在检测到人脸后加了眼镜贴图还做了简单的眨眼检测分数明显比同组的纯检测版本高。综合项目的评分通常看完成度、创新点和工程规范性代码注释、模块划分、异常处理都是加分项。哪怕功能简单只要结构清晰、能跑通演示分数就不会低。4. 常见问题与排查技巧实录这些坑我替你踩过了实操过程中遇到问题是非常正常的这里整理一份我自己的排查速查表基本覆盖了热词里搜的那些高频问题问题现象可能原因解决方案ModuleNotFoundError: No module named cv2没装OpenCV或装错环境pip install opencv-contrib-python确认当前虚拟环境findContours返回值数量不对OpenCV版本差异OpenCV 4.x用contours, hierarchy cv2.findContours(...)接两个返回值fillPoly绘制没有效果输入图像是只读的或数据类型不对先用image.copy()确认图像是三通道uint8棋盘格角点检测失败图像太小、角度太偏、反光严重换大棋盘格、增加图像数量、预处理增强对比度用cv2.checkChessboard()预筛cv2.VideoCapture打开RTMP失败后端不支持流媒体协议或网络延迟换带FFmpeg的OpenCV版本用VLC验证链接是否可用VS里OpenCV代码编译通过但运行报DLL缺失系统PATH里没有OpenCV的bin目录把opencv_world*.dll所在目录添加到系统PATH后重启人脸检测框太多或乱飞参数没调加大minNeighbors到5~10调大minSize固定摄像头分辨率除了表里这些问题还有一个经验想单独拎出来说。调试图像处理代码时一定要养成“肉眼检查中间结果”的习惯。每做一步处理就用cv2.imshow()或者cv2.imwrite()输出当前的图像灰度图、二值图、边缘图、轮廓图一个个看过来。很多同学写代码一跑就报错报错信息里的(-215:Assertion failed)提示“输入图像为空”或“尺寸不匹配”一查才发现是前一步图像处理出来是张全黑图后面所有操作自然全废了。另外建议大家写一个小工具函数def show(img, titledebug):内部实现缩放、显示、等待按键调试效率能提升很多。不要觉得这是浪费时间调参的每一分钟都是在积累对图像数据的感觉。好记性不如烂笔头这些坑如果只是看一遍遇到的时候照样会慌。建议把自己踩过的坑按“问题现象—原因—解决方案”的格式记录在复习资料里期末复习时回头看特别有价值。5. 复习资料怎么用从实验到考试的最后一步实践操作之外的复习资料同样重要。这门课的期末考试通常是客观题加大题大题集中在基础算法的原理推导和计算比如Canny检测的步骤、直方图均衡化的计算过程、SIFT描述子的构造思路、相机标定的数学模型等。这些内容光靠背代码是背不出来的必须理解原理。我的复习方法是把复习资料里的问题分类整理第一类是概念题比如“什么是图像金字塔”“什么是非极大值抑制”第二类是计算题比如给定一个直方图手动计算均衡化后的灰度映射第三类是综合题比如“如果要检测视频中的运动物体你会怎么设计流程”。每一类都要能用自己的话说出来而不是背参考答案。用自己的话能讲清楚的才是真正掌握了。复习资料里如果有历年卷配上答案是加分项但别太依赖。计算机视觉这个领域算法迭代很快但基础原理是稳定的。把课堂上讲的几个核心算法的流程捋清楚配合实验里的实际操作记忆考试拿高分并不难。6. 最后分享一个我自己一直在用的小技巧如果你未来还要继续深入这个领域建议从现在开始养成一个习惯每个实验做完后用Markdown写一篇简短的实验复盘记录实验目的、实现思路、核心代码、踩过的坑、改进方向。这个习惯的好处在于等到期末复习或者找工作时整理项目经历你不需要重新回忆当时做了什么——直接翻笔记就是了。我自己实习面试时被问到“讲讲你做过的图像分割项目”我直接打开当时的实验复盘把思路和结果流畅地讲了一遍面试官还追问了形态学操作的参数选择逻辑这些东西如果只靠期末突击是绝对答不出来的。课程结束不是终点。6次实验看起来只是作业但它们其实是一个个微型的工程项目把“拿到图像—分析问题—设计流程—实现验证—优化调参”这一整条思路走熟了以后无论遇到目标检测、图像分割还是三维重建你都会知道从哪里下手。这比记住任何一个API都重要得多。本文还有配套的精品资源点击获取