You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET6最新版Emgu C#训练Image<Gray,byte>列表报类型转换错误

.NET6 新版Emgu CV人脸识别训练编译错误修复

原始问题代码

var files = Directory.GetFiles("./Folder/Of/Images", "*.png");

var trainedFaces = new List<Image<Gray, byte>>();

foreach (var f in files)
{
    var trainedImage = new Image<Gray, byte>(f);
    trainedFaces.Add(trainedImage);
}


EigenFaceRecognizer recognizer = new EigenFaceRecognizer(trainedFaces.Count, Threshold);

recognizer.Train(trainedFaces, Enumerable.Range(1, trainedFaces.Count).ToArray());

报错信息

cannot convert from 'System.Collections.Generic.List<Emgu.CV.Image<Emgu.CV.Structure.Gray, byte>>' to 'Emgu.CV.IInputArray'

错误原因

适配.NET6的新版Emgu CV(4.5及以上版本)调整了FaceRecognizer.Train方法的参数签名,不再兼容直接传入List<Image<Gray, byte>>类型的训练集合,要求两个入参均实现IInputArray接口:第一个参数为多图像组成的输入数组容器,第二个参数为对应标签组成的输入数组容器。旧教程基于低版本Emgu编写,参数兼容逻辑已经失效。

修复代码

首先引入必要命名空间:

using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.Face;
using Emgu.CV.Util; // VectorOfMat、VectorOfInt定义在该命名空间

修改训练逻辑如下:

var files = Directory.GetFiles("./Folder/Of/Images", "*.png");

// 用Emgu内置的多Mat容器替代List<Image>存储训练图
using VectorOfMat trainedFaces = new VectorOfMat();
// 用对应整型向量容器存储标签
using VectorOfInt faceLabels = new VectorOfInt();

int currentLabel = 1;
foreach (var filePath in files)
{
    using var faceImage = new Image<Gray, byte>(filePath);
    // 将Image对象的Mat属性推入训练容器
    trainedFaces.Push(faceImage.Mat);
    // 推入对应标签
    faceLabels.Push(new[] { currentLabel });
    currentLabel++;
}

EigenFaceRecognizer recognizer = new EigenFaceRecognizer(trainedFaces.Size, Threshold);
// 传入符合接口要求的参数完成训练
recognizer.Train(trainedFaces, faceLabels);

注意事项

  • 所有Emgu封装的非托管对象(VectorOfMat、VectorOfInt、Image<,>等)建议使用using声明自动释放,避免内存泄漏
  • 训练前需要将所有人脸样本对齐、裁剪缩放到完全一致的尺寸,否则训练会抛出异常或识别准确率不达标
  • 标签值不需要从1开始连续递增,仅需保证同一人的所有样本对应同一个整数标签即可

内容的提问来源于stack exchange,提问作者Saylent

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 20:31:11