.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
相关产品推荐
相关产品推荐

