如何将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
相关产品推荐
相关产品推荐

