Emgu CV 4.5人脸识别预测结果不显示 仅返回0和-1问题求助
问题根源排查
你遇到的只显示0和-1的问题,核心有两个致命错误:
- 字符串标签转整数标签的逻辑完全错误:你写的转换委托每次都返回默认的0值,所有训练标签都被转为0,训练出来的模型只能返回0或者未知的-1。
- EigenFaceRecognizer的Predict返回值
Label是整数类型,你直接把它当成人名输出,自然只会显示数字,其中-1是置信度低于阈值时返回的未知人脸标识。
另外还有性能问题、阈值设置不合理、代码逻辑小bug等也会影响使用。
具体修改方案
1. 新增标签映射字典
在Form1的类变量定义区新增字典,用来存储整数标签和实际人名的对应关系:
Dim labelMap As New Dictionary(Of Integer, String)()
2. 修复标签转换逻辑
删除Timer1_Tick里原来错误的字符串转整数标签代码,替换为以下逻辑:
' 生成整数标签,直接用人名列表的索引作为训练用标签,同时存映射关系 Dim labelsint As New List(Of Integer)() labelMap.Clear() For i = 0 To labels.Count - 1 labelsint.Add(i) labelMap(i) = labels(i) Next
3. 修改文字绘制逻辑
不要直接输出pname.Label,先做映射转换,未知人脸特殊处理:
' 先判断是否为未知人脸 Dim displayName As String = If(pname.Label = -1, "未知", labelMap(pname.Label)) ' 再绘制文字 CvInvoke.PutText(currentFrame, displayName, New Point(faceFound.X - 2, faceFound.Y - 2), FontFace.HersheyTriplex, 0.5, New MCvScalar(255, 255, 0), 2)
4. 调整识别器参数
把EigenFaceRecognizer的阈值调高,你当前设置的0.001过低,几乎所有人脸都会被判为未知返回-1,建议先调整到2000~5000区间测试:
Dim recognizer As New EigenFaceRecognizer(3000, 4000) ' 第二个参数是阈值,可根据实际效果调整
5. 优化训练逻辑(性能优化)
不要每帧都重新训练识别器,把识别器训练逻辑抽出来,只在程序启动加载完训练数据和新增人脸完成两个时机执行训练即可,每帧重复训练会严重拉低程序运行效率。
6. 修复其他小bug
Button1_Click里的Resize逻辑写反了,result未初始化就调用,修改为:
' 原代码CvInvoke.Resize(result, TrainedFace, New Size(100, 100), interpolation:=Inter.Cubic)替换为: CvInvoke.Resize(TrainedFace, TrainedFace, New Size(100, 100), interpolation:=Inter.Cubic)
内容的提问来源于stack exchange,提问作者SupBe
相关产品推荐
相关产品推荐

