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

如何将OpenCvSharp.Mat转换为Emgu.CV.Mat?

OpenCvSharp.Mat转Emgu.CV.Mat的解决方案

你遇到的类型转换错误,是因为OpenCvSharp和Emgu CV属于独立的.NET封装库,两者的Mat类型无法直接隐式转换。以下是两种实用的转换实现,满足你将OpenCvSharp.Mat转为Emgu.CV.Mat的需求:

方法一:基于原生指针的零拷贝转换

利用两个库都能直接访问底层OpenCV原生Mat指针的特性,实现无内存拷贝的高效转换:

public static Emgu.CV.Mat OcvMatToEmguMat(OpenCvSharp.Mat ocvMat)
{
    // 获取OpenCvSharp Mat的底层原生指针
    IntPtr nativePtr = ocvMat.CvPtr;
    // 通过原生指针构造Emgu CV Mat,共享同一块内存
    return new Emgu.CV.Mat(nativePtr, false);
}

注意:此方式下两个Mat共享底层内存,释放任意一个都会导致另一个失效,需确保两者生命周期同步,否则会引发内存错误。

方法二:像素数据拷贝的独立转换

如果需要两个Mat拥有独立内存空间,避免生命周期冲突,可通过像素数据复制实现:

public static Emgu.CV.Mat OcvMatToEmguMat(OpenCvSharp.Mat ocvMat)
{
    // 创建与原Mat尺寸、格式匹配的Emgu CV Mat
    Emgu.CV.Mat emguMat = new Emgu.CV.Mat(
        height: ocvMat.Height,
        width: ocvMat.Width,
        depthType: Emgu.CV.CvInvoke.GetDepthType((Emgu.CV.CvEnum.DepthType)ocvMat.Depth()),
        channels: ocvMat.Channels()
    );
    
    // 将OpenCvSharp Mat的像素数据复制到Emgu CV Mat中
    using (var tempOcvMat = new OpenCvSharp.Mat(emguMat.CvPtr))
    {
        ocvMat.CopyTo(tempOcvMat);
    }
    
    return emguMat;
}

调整后的人脸检测代码

将转换逻辑集成到你的检测方法中,即可解决类型不兼容问题:

public static void DetectFace(OpenCvSharp.Mat inputImage)
{
    // 转换OpenCvSharp Mat到Emgu CV Mat
    using (Emgu.CV.Mat emguInput = OcvMatToEmguMat(inputImage))
    using (var faceDetector = new Emgu.CV.FaceDetectorYN("myTrainingModel", "", new Size(inputImage.Width, inputImage.Height)))
    using (var detectionResults = new Emgu.CV.Mat())
    {
        // 正常调用Detect方法
        faceDetector.Detect(emguInput, detectionResults);
        
        // ... 后续处理检测结果的逻辑
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 15:45:08