Я использую OpenCVSharp для обработки изображений, но теперь мне также нужны некоторые функции Emgu CV для обнаружения лиц на моих изображениях.
У меня есть следующий минимальный пример:
public static void DetectFace(OpenCvSharp.Mat inputImage) {
var faceDetector = new Emgu.CV.FaceDetectorYN("myTrainingModel", "", new Size(inputImage.Width, inputImage.Height));
var emguMat = new Emgu.CV.Mat();
faceDetector.Detect(inputImage, emguMat); // <-- gives error: Argument 1: cannot convert from 'OpenCvSharp.Mat' to 'Emgu.CV.IInputArray'
// ... more code
}
Я получаю следующую ошибку:
Аргумент 1: невозможно преобразовать OpenCvSharp.Mat в Emgu.CV.IInputArray.
Я знаю, что возникшую ошибку можно устранить путем преобразования OpenCvSharp.Mat в Emgu.CV.IInputArray, однако мне бы хотелось знать, как преобразовать OpenCvSharp.Mat в Emgu.CV.Mat. Поскольку Emgu.CV.Mat реализует интерфейс Emgu.CV.IInputArray, мне все равно понадобится возможность конвертировать его в Emgu.CV.Mat позже в моем коде.





Я нашел следующее решение, которое сработало, спасибо wingziye за то, что поделились.
public static void DetectFace(OpenCvSharp.Mat inputImage) {
var faceDetector = new Emgu.CV.FaceDetectorYN("myTrainingModel", "", new Size(inputImage.Width, inputImage.Height));
var emguMat = new Emgu.CV.Mat();
// Create an Emgu Mat for the input parameter
var emguInputImage = new Emgu.CV.Mat();
// Load the OpenCvSharp.Mat into the new Emgu Mat.
Emgu.CV.CvInvoke.Imdecode(inputImage.ToBytes(), Emgu.CV.CvEnum.ImreadModes.AnyColor, emguInputImage );
// running face detection on the new Emgu Mat.
faceDetector.Detect(emguInputImage , emguMat);
// ... more code
}
Я бы просто исправил OpenCvSharp и добавил обертку для
FaceDetectorYN. В существующем коде должно быть достаточно вдохновения, чтобы позволить вам это сделать. Затем сделайте запрос на включение, чтобы передать его в восходящий поток. Использование двух разных библиотек-оболочек для одной и той же собственной библиотеки кажется немного :/ и, вероятно, просто напрашивается на проблемы.