
简介一套基于OpenCV的手势识别系统Python源码面向计算机相关专业毕业生及计算机视觉学习者既可作为毕业设计或课程大作业的主体方案也适合想通过实战掌握图像处理与手势识别原理的入门到中级开发者。项目曾获导师认可并通过评审98分源码经本地编译和严格调试确保可直接运行实现覆盖图像采集、预处理、特征提取、手势定位与识别的完整流程并包含详尽注释便于追踪算法思路与二次开发。资源共2000个文件其中约1995张JPG图片构成手势样本与测试数据集4个Python脚本承载核心识别逻辑1个Markdown文档提供使用与结构说明压缩包总大小约22.74MB目录组织清晰可按模块研读或替换数据重跑实验。目前已有46人学习浏览。通过这套源码读者不仅能获得一个可演示的毕业设计成果还能系统实践OpenCV在实时图像处理与特征匹配中的应用为后续向深度学习手势识别方向延伸打下基础。1. 手势识别毕业设计到底在做什么从OpenCV到可交差的系统宿舍灯光偏黄摄像头视角低手一靠近就过曝。此时肤色检测把桌上的暖水瓶也算作手。这就是OpenCV手势识别最常见的翻车现场。这套系统不是“调用一个现成模型”而是用图像处理流程把“手”从背景里剥出来再根据轮廓几何判断你伸了几根手指。它适合作为Python毕业设计因为原理完整、能演示、可扩展不需要GPU普通笔记本就能跑。你会接触到颜色空间转换、形态学、轮廓分析、凸包缺陷这些经典图像处理知识这些恰恰是面试时能讲清楚的技术点。下文从选型到参数按能复现的路径拆开讲。2. 先立住技术底座OpenCV手势识别的主流方案与选型理由2.1 肤色检测与背景分割哪种方法在宿舍灯光下不翻车手势识别第一件事是把“手”从画面里分离出来。常见做法有三种基于肤色、基于背景建模、基于深度学习。基于肤色最常用因为实现简单、实时性好OpenCV里就是几行颜色空间转换。但肤色在RGB空间下对光照极其敏感所以得先转到HSV或YCrCb空间只取H色调通道和S饱和度通道的一部分范围来过滤。YCrCb的Cr分量对肤色聚类更集中受亮度影响比RGB小适合肤色分割。另一种是背景建模例如OpenCV的createBackgroundSubtractorMOG2。它适合摄像头固定、背景基本不变的场景。如果毕业设计演示时背景不乱动用MOG2能把运动的物体包括手完整抠出来然后对前景做轮廓分析这样不依赖肤色不受手部颜色深浅影响。但缺点是手一旦停下不动几秒后会被吸收成背景背景有人经过也会造成干扰。我一般建议两者结合先用MOG2或帧差法得到运动区域再在这个区域内做肤色检测锁定“运动中的肤色区域”。这个组合在答辩演示时效果最稳。那为什么不上深度学习目标检测模型如YOLO确实能直接框出手但训练需要标注数据推理依赖模型文件在毕业设计里容易变成“调包”。OpenCV方案的优势在于每一步都能可视化、每个参数都能解释评委问到底层原理你能答得上来。深度学习可以作为进阶优化放到第6章讲。2.2 轮廓提取与凸包缺陷识别手指数量的关键路径当手被分割成二值图后下一步是找轮廓cv2.findContours。然后找出最大轮廓即手部区域。要判断手伸了几根手指经典方法不是数轮廓上的“尖角”而是用凸包缺陷。手张开时轮廓上指根位置会出现四个明显凹陷握拳时几乎没有凹陷。凸包缺陷函数cv2.convexityDefects能返回这些凹陷的起点、终点和最远点通过凹陷数量加一就能算出伸展的手指数。这里有三个参数会影响手指计数轮廓面积下限用于过滤小噪点凸包缺陷的深度阈值太浅的凹陷不算数以及手指尖端的角度范围。角度太钝的尖端可能是手腕或噪声。实际调参时我习惯把深度阈值设在轮廓外接矩形高度的0.03倍左右角度上限设在90度附近。这个比例在不同分辨率下缩放性较好比固定像素值更抗折腾。找到轮廓后常见错误是直接拿最大轮廓当手但背景物体可能比手更大。所以需要计算轮廓的面积和外接矩形长宽比。手部正常的长宽比在0.3到3之间太夸张的矩形很可能不是手。还可以用轮廓的凸包面积与轮廓面积之比solidity来判断手的solidity通常在0.6到0.9之间一个不规则背景块往往更低。加上这些过滤条件后误检率能大幅下降。2.3 静态识别与动态轨迹毕业设计该做到哪一步手势识别系统按交互方式分两类静态手势识别和动态手势识别。静态识别是每一帧独立判断手型比如识别数字1到5、握拳、OK手势。它不需要历史状态实现简单适合作为毕业设计核心功能。动态识别需要跟踪手部轨迹或手势变化过程比如“从左往右挥手”代表翻页、“握拳再张开”代表确认这类需要记录连续多帧的质心坐标或手型序列再用滑动窗口或简单的状态机做判断。对毕业设计而言我建议先把静态识别做扎实能稳定区分1到5和握拳再追加一两个动态指令作为亮点。不要一开始就上LSTM之类数据处理和标注量会拖垮进度。一个可行的方案是用质心跟踪轨迹方向判断把连续20帧质心的平均位移向量量化成上下左右四个方向阈值根据画面中手的移动速度去调。这样没有时间序列模型也能做出“动态”效果答辩时更好解释。手部在视频中的抖动会造成轨迹噪声需要做平滑。常见做法是维护一个质心坐标队列用加权移动平均或中值滤波来降低抖动。方向判断不能只看两帧至少要累计5帧以上的位移。还可以设置最小位移阈值如果低于阈值就认为手静止避免轻微晃动产生误触发。下表是两种识别方案在实现方式和效果上的对比帮你决定先做哪个。方案实现难度实时性适合展示的功能主要风险静态识别较低单帧处理高数字计数、握拳、OK、剪刀手光照变化导致阈值失效动态轨迹中等需要状态管理中挥手翻页、左右滑动、画圈确认手抖造成误触、方向误判静态识别是动态识别的基础动态识别只是加上状态平滑和轨迹判断。建议把静态识别的准确率做到95%以上再考虑动态部分。3. 把源码跑起来环境配置与最小可运行命令3.1 Python与OpenCV安装一次装对的三个细节毕业设计最常见的卡点不是算法而是环境。第一次装OpenCV十个人里有三个会遇到modulenotfounderror: No module named cv2。原因多半是装错了包。OpenCV在Python里的正式安装包是opencv-python导入名是cv2。不要用pip install opencv那是另一个不相关项目。要在命令行确认Python版本python --version。建议使用Python 3.8到3.10新版本3.12有时会遇到某些已编译轮子缺失的情况虽然现在opencv-python已经支持更高版本但为了省事还是选3.10比较稳。安装命令pip install opencv-python # 如果需要完整模块如跟踪、特征匹配可以用 opencv-contrib-python # pip install opencv-contrib-python装完验证python -c import cv2; print(cv2.__version__)看到版本号就说明成功。如果提示找不到模块优先确认当前终端用的是不是同一个Python解释器。常见做法是在虚拟环境里装python -m venv .venv # Windows激活 .venv\Scripts\activate # macOS/Linux激活 source .venv/bin/activate虚拟环境能避免把全局环境搞乱尤其是一台机器同时装了Anaconda和各种IDE自带的解释器时。我再给一个排查技巧在代码里打印sys.executable看看当前脚本到底由哪个python在跑再对应用python -m pip安装能省掉一大半环境问题。3.2 跑通手势识别主程序摄像头索引与启动参数拿到一个手势识别源码包第一步不是读代码而是先把它跑起来。多数源码会有一个main.py打开摄像头。摄像头索引常是0笔记本内置摄像头是0外接USB摄像头可能是1或更高。如果代码运行时报错或画面全黑先试把cap cv2.VideoCapture(0)改成cv2.VideoCapture(1)。这类源码通常会提供参数比如python main.py --camera 0 --mode static这里--camera指定摄像头索引--mode可选static静态手势或dynamic动态轨迹。启动后如果窗口出现说明通路已经打通。接下来要看效果别急着改算法。先在正常光照下伸手看窗口里的轮廓是否贴合手型再在侧光、背光下试试记录哪里开始失败。这一步的观察结果直接决定后面调哪个参数。一个合格的OpenCV手势识别源码包通常包含几个部分主程序入口main.py或app.py、手势检测模块detector.py、参数配置文件config.py或config.yaml以及一个依赖清单requirements.txt。你可以打开requirements.txt看版本要求但不要盲从因为作者的环境可能和你不一样。一个稳妥做法是单独建虚拟环境然后把requirements.txt里的包逐个装。如果装完后和系统已有包冲突就优先保证OpenCV和NumPy能同时导入即可。摄像头相关还有两个容易忽略的参数分辨率与帧率。可以用以下代码查询当前摄像头支持的分辨率import cv2 cap cv2.VideoCapture(0) print(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) print(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) print(cap.get(cv2.CAP_PROP_FPS))有些笔记本摄像头默认分辨率只有640x480但实际采集时可能因为驱动问题输出奇怪的尺寸比如640x360。如果后续代码里硬编码了ROI坐标尺寸变了就会导致手势区域被裁剪。建议在初始化时显式设置cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)注意VideoCapture在Windows下默认用MSMF后端有些摄像头需要改用DSHOW后端才能正常打开cap cv2.VideoCapture(0, cv2.CAP_DSHOW)这段在Windows下常能解决“摄像头能被系统相机打开但OpenCV打不开”的问题。Mac和Linux下一般不需要指定。3.3 写一个最小手势识别脚本从肤色检测到指尖计数如果你拿到的是空框架或者想验证自己的理解可以用几十行代码实现一个最简版本。下面这段代码能把摄像头中最大肤色区域提取出来并用凸包缺陷估算手指数量。import cv2 import numpy as np cap cv2.VideoCapture(0) def count_fingers(contour): # 计算轮廓的外接圆半径用于过滤噪声 (x, y), radius cv2.minEnclosingCircle(contour) area cv2.contourArea(contour) if area 5000 or radius 20: return 0 hull cv2.convexHull(contour, returnPointsFalse) defects cv2.convexityDefects(contour, hull) count 0 if defects is not None: for i in range(defects.shape[0]): s, e, f, d defects[i, 0] start tuple(contour[s][0]) end tuple(contour[e][0]) far tuple(contour[f][0]) # 用余弦定理计算指尖角度 a np.linalg.norm(np.array(end) - np.array(far)) b np.linalg.norm(np.array(start) - np.array(far)) c np.linalg.norm(np.array(start) - np.array(end)) angle np.degrees(np.arccos((a*a b*b - c*c) / (2*a*b))) # 深度阈值用外接圆半径的一半 if d radius * 0.5 and angle 90: count 1 return count 1 while True: ret, frame cap.read() if not ret: break frame cv2.flip(frame, 1) # 镜像更符合直觉 blur cv2.GaussianBlur(frame, (5, 5), 0) hsv cv2.cvtColor(blur, cv2.COLOR_BGR2HSV) mask cv2.inRange(hsv, (0, 30, 60), (25, 175, 255)) mask2 cv2.inRange(hsv, (170, 30, 60), (180, 175, 255)) mask cv2.bitwise_or(mask, mask2) mask cv2.morphologyEx(mask, cv2.MORPH_CLOSE, np.ones((7, 7), np.uint8)) contours, _ cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) if contours: contour max(contours, keycv2.contourArea) fingers count_fingers(contour) x, y, w, h cv2.boundingRect(contour) cv2.rectangle(frame, (x, y), (x w, y h), (0, 255, 0), 2) cv2.putText(frame, fFingers: {fingers}, (10, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2) cv2.imshow(Gesture, frame) if cv2.waitKey(1) 0xFF ord(q): break cap.release() cv2.destroyAllWindows()这段代码的逻辑是读一帧图像后先做镜像翻转避免左右手感觉相反再高斯模糊降低肤色区域内的噪点然后从BGR转到HSV用两个范围掩膜把Hue两端的红色区域都取出来再合并。形态学闭运算能填平手心里的暗色空洞让轮廓更完整。查找轮廓时只用RETR_EXTERNAL只取最外层轮廓避免把指缝里的次级轮廓也算进来。count_fingers函数先过滤过小轮廓然后求凸包缺陷通过缺陷深度和指尖角度两个条件筛出指根凹陷。最后显示的标记包括外接矩形和手指数。这里有几个参数要说明7x7的核大小决定闭运算的填充力度面积5000是像素阈值如果你的摄像头是1280x720手离镜头近时面积会远超这个值radius * 0.5作为深度阈值radius是手的最小外接圆半径这个阈值会随手的远近自动缩放比固定像素值更合理。角度小于90度是为了排除腕部等浅凹点。4. 参数调优与效果验证让识别准确率从“能用”到“答辩能演示”4.1 HSV阈值怎么定摆脱玄学调参很多新手直接抄网上的HSV范围但换一个房间效果就崩于是开始反复试数字这基本是玄学调参。正确做法是先手动取一段画面上肤色区域的HSV样本再统计分布。写一个小工具用鼠标在视频窗口里框选手部区域输出该区域的H、S、V均值与范围。代码可以很简单import cv2 import numpy as np def nothing(x): pass cap cv2.VideoCapture(0) cv2.namedWindow(Calib) cv2.createTrackbar(H_min, Calib, 0, 180, nothing) # 同理创建 H_max, S_min, S_max, V_min, V_max while True: ret, frame cap.read() hsv cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) h_min cv2.getTrackbarPos(H_min, Calib) # 把其他轨道的值也读出来 mask cv2.inRange(hsv, (h_min, s_min, v_min), (h_max, s_max, v_max)) cv2.imshow(Mask, mask) if cv2.waitKey(1) ord(q): break拖动滑条观察掩膜效果当背景和手分离最干净时把参数记下来。这个过程中你会发现S、V通道的容忍度比H要大很多因为肤色在H通道上聚类非常稳定真正会变的是饱和度和明度。所以优先调H范围再放宽S和V。如果你用YCrCb空间同样可以用这种滑条方式校准Cr和Cb的范围。我自己做的时候会先截一张手部特写用它生成一个HSV色块统计图再把范围写进配置这样后面基本不用大改。4.2 形态学操作与轮廓过滤四个必须调的点二值掩膜里不可避免有以下问题毛孔和汗毛造成的小空洞、背景噪点、以及手指边缘的毛刺。形态学操作是解决这些的标准手段。常见步骤是先做一次开运算先腐蚀后膨胀去除小噪点再做一次闭运算先膨胀后腐蚀填补空洞。核的大小按图像尺寸比例来640x480下5x5到9x9是常用范围。如果核太大手指缝隙会被填掉导致手指计数偏少核太小噪点去不干净。这个平衡需要实测。轮廓过滤是第二个关键。除了面积下限还常用三个特征外接矩形长宽比、轮廓凸度轮廓面积除以凸包面积、以及有效轮廓数量。手部的凸度一般在0.6以上背景碎片往往低于0.5。另外当画面中有多块肤色区域时只保留面积最大的那块通常是安全的如果要支持双手则需要加一条“两块区域之间的距离大于某个阈值”的条件。第三个点是轮廓近似。用cv2.approxPolyDP做多边形逼近时epsilon值设得太大会把手指尖的轮廓磨平凸包缺陷就会变少设得太小轮廓出现锯齿产生大量伪缺陷。经验值是对轮廓周长乘0.02到0.04。最后还有一个容易被忽略的点在找凸包缺陷之前先确保轮廓是凸的。如果轮廓本身凹进去很深求出的convexityDefects可能包含噪声。可以用cv2.convexHull拿到凸包点只在凸包上做几何判断。4.3 识别结果的可视化与FPS控制演示稳定性的关键答辩演示最尴尬的一幕是平时准确率很高一上台就疯狂闪烁。原因往往是识别结果没有做平滑。OpenCV处理的是视频流你看到的每一帧都是独立判断只要有一帧误检屏幕上就会闪一下。解决办法是引入帧间判定只有连续N帧识别为同一个结果才更新显示。例如连续5帧手指数量都是3才在界面上显示“3”。当新结果出现时先记下来等待5帧确认。这个逻辑能滤掉大多数偶发误检。N值越大越稳定但会有明显延迟建议N5到8。帧率控制也很重要。识别循环里如果每帧都做完整的图像处理CPU会跑满。常见做法是加一个处理间隔比如每2帧或每3帧识别一次中间帧直接显示。也可以限制循环帧率到30帧delay int(1000 / 30) # 在循环末尾 cv2.waitKey(delay)这里waitKey的参数单位是毫秒。30毫秒大约等于33帧每秒但实际运行会更低因为处理本身耗时。如果想看到真实的处理速度可以在循环里记录时间import time start time.time() # 处理代码... fps 1 / (time.time() - start)把fps显示在窗口上调参时能直观看到每一次算法的额外开销。如果fps低于15说明算法太重优先减少高斯模糊核、缩小输入尺寸。常见的做法是把帧resize成320x240再处理处理完再贴回原帧上。识别精度不会明显下降速度能快3倍。我在项目里使用的默认方案就是640x480采集320x240处理手部ROI放大回原图画框。4.4 用录制的视频测评准确率给答辩准备数字依据调参调了半天最后要拿数据说话。最笨但有效的方法是用一个脚本读入预先录制的测试视频逐帧或每隔几帧记录“真值”和“识别值”最后统计准确率。录制测试视频时分别在不同的光照条件、不同背景下做1到5的手势每段10秒左右。然后用一个离线脚本跑import cv2 video_path test_3.mp4 cap cv2.VideoCapture(video_path) total 0 correct 0 while cap.isOpened(): ret, frame cap.read() if not ret: break # result recognize(frame) # 你的识别函数 # 这里需要按视频时间轴对应标签 # 实际实现时用腕表或秒表分段记录开始时间 pass实际实现里给每一帧打标签非常耗时。一个简化的做法是在视频开头先显示准备好的手势标签画面里放一张写着数字的卡片然后手按对应数字姿势保持5秒。离线测试时你只需要按时间段统计不用逐帧标注。比如第5到第10秒的标签是“3”那么这段时间内识别结果中出现次数最多的值就是该时段的识别结果和“3”比较即可。这样你就能得到每个手势的召回率、整体准确率答辩时写在演示文档里。评委很吃这一套因为多数人只做定性演示你能给出定量数据。5. 避坑OpenCV手势识别最常见的5个翻车现场5.1 modulenotfounderror: No module named cv2现象用pip install opencv-python安装之后运行脚本仍然报No module named cv2。原因最常见是当前终端使用的是另一个Python。Anaconda和系统Python并存时pip可能装到了conda环境但脚本用系统Python执行。另外一个原因是安装失败后留了残留Python导入时读到的不是同一个site-packages。解决在代码第一行打印sys.executable和sys.path确认解释器路径再用这个解释器对应的-m pip安装。一个通用命令是python -m pip install opencv-python这个写法能保证安装到当前“python”命令对应的环境里。如果还不行直接把虚拟环境删了重建通常5分钟能解决。我当时遇到这个问题时就是习惯用Anaconda的python但终端里默认指向了另一个换成python -m pip后立刻就好了。5.2 cv2.error: OpenCV(4.4.0) ... 无法打开摄像头或读取视频现象运行后终端输出一段以“cv2.error”开头、包含cant open camera by index或CAP_IMAGES的错误堆栈。有些Windows用户会看到热词里常见的“cv2.error: OpenCV(4.4.0) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build...”这种很长的一串。原因摄像头被其他程序占用笔记本自带相机会被微信会议软件锁住或者OpenCV默认后端和你系统不兼容。那串带Users和Temp的路径其实是OpenCV在Windows上编译时留下的临时路径不是你的库坏了别被它吓到。解决先关掉所有占用摄像头的程序再试不行就换后端视频捕获如前文的cv2.CAP_DSHOW。还可以用cap.isOpened()做个判断打不开时就打印提示而不是直接崩溃。如果换到摄像头索引1成功了说明你的外接摄像头不是默认设备以后启动代码记得带参数指定索引。5.3 肤色检测把背景当手桌面木色、暖光全中招现象手没入镜屏幕上却有一个大轮廓在动或者手一放上去识别数量乱跳。原因HSV阈值范围太宽把接近肤色的木质桌面、暖色调书皮、甚至偏黄的灯光区域都包括进去了。这是肤色检测方案的固有局限。解决第一步收紧S范围肤色饱和度在40到170之间很多背景的饱和度低于30或高于180可直接排除。第二步在HSV处理前先做背景抑制把MOG2找到的前景和肤色掩膜做与操作运动背景也被去掉。第三步额外加上轮廓面积、长宽比过滤。如果背景大面积是红色或橙色可以再加一个H范围的窄阈值而不是用两端的全段。我在宿舍里调试时桌面的暖色台灯一照手背上全是反光最后是把S上限降到160同时把V下限从50提到80才把桌面排除干净。5.4 手指并拢时凸包缺陷算不对手指数量抖动现象四指并拢时手指数从4跳到2或3握拳时显示1或乱跳。原因并拢时指根区域的凹陷被闭运算填平了或者缺陷深度达不到阈值所以没被识别为指根。握拳时指尖和指根几乎融合轮廓上的凸包缺陷很少但掌纹形成的轮廓凹点会被错误计数。解决对于并拢问题降低深度阈值或者减少形态学核大小看看是否能恢复凹陷。对于握拳误判可以在凸包缺陷判断条件里增加“缺陷最远点到外接圆中心的距离”限制太靠近中心的不算手指根。另一个实用方案改用基于手掌中心距离的方法。将手掌区域的重心作为圆心从重心向轮廓端点做距离曲线计算曲线上“峰”的数量来得到手指数。这种方式对并拢更鲁棒实现也不难。如果你用凸包缺陷调了半小时还没效果果断换这个方案可能十分钟就稳了。5.5 程序运行卡顿画面像幻灯片现象窗口能显示但手一动画面就卡CPU占用100%。原因每一帧都在做全尺寸高斯模糊、多个inRange、形态学、findContours这些操作如果输入是1080p累计耗时可能超过200毫秒。解决先缩小图像再处理比如把帧resize到320x240识别得到的手部ROI坐标按比例映射回原图。这一步通常能把单帧处理耗时降到30毫秒以内。另外减少高斯模糊核到3x3或者干脆用bilateralFilter代替虽然慢一点但边缘保留更好。形态学改用一次闭运算不要开闭都来。还有一个隐藏点如果代码里用了cv2.imshow每次都全屏刷新也会拖慢窗口。可以用cv2.namedWindow设置合适窗口大小或配合cv2.resizeWindow。我自己做性能优化时会先记录每一行代码的耗时把最耗时的三个操作找出来往往就是resize和形态学这两个。6. 进阶把手势识别从“能交差”升级成“有亮点”6.1 增加一个手势指令控制鼠标指针到了这个阶段成果已经能答辩了。如果想再加分可以把手势变成指令。最简单的是用“手指数量”映射成鼠标动作一根手指移动鼠标两根手指点击。核心是用OpenCV找到手部质心坐标把质心在画面中的位置映射到屏幕坐标。映射时用线性变换注意画面是镜像的x轴要取宽度减去坐标。这个功能能现场演示交互感强评委通常会有兴趣。6.2 引入MediaPipe优化手部关键点如果肤色检测实在调不好可以换一个思路用MediaPipe的Hands模块检测21个手部关键点。它不依赖肤色对光照和背景鲁棒性高很多代码量还更少。你只需要在OpenCV读取的帧上调用mp.solutions.hands拿到landmark后计算相邻关键点角度来判断手势。这个替换能让识别准确率大幅提升但代价是每帧多花几毫秒到十几毫秒且需要pip install mediapipe。需要注意MediaPipe在Python 3.8到3.10上最稳定版本不匹配会出现安装失败。这个方案适合你时间还剩一周以上、想把系统打磨得更稳的情况。6.3 把识别过程记录成日志生成演示图表我给毕业设计加的最后一个小功能是记录每次识别结果和耗时存成CSV再用matplotlib画一张准确率曲线。这样做的好处是答辩时可以展示“真实数据”而不是只播放效果视频。CSV只需要在识别循环里每30帧记录一行时间戳、识别值、当前FPS。答辩前跑一段测试数据生成图表放到PPT里能明显提升作品的完成度。最后说个自己的教训我当年做手势识别时把大量时间花在调HSV上结果答辩前一天才发现演示环境灯光偏红整个阈值崩盘。后来自我总结一定要在最终演示场地预留出至少半天做参数校准和录制样片。样片比程序窗口更可靠现场摄像头万一出问题播样片还能救场。希望帮到你。本文还有配套的精品资源点击获取