这篇文章来说说怎么将Opencv的Mat通过dll链接库传递参数给Emgucv的Image类使用。
这里还是借助两个中间量来实现这个工程,即Opencv中的 IplImage类和Emgucv里的MIplImage类。
首先,将Mat类转换为IplImage指针
void* MatToIplImage(Mat src)
{
IplImage dst = src; //将Mat类转换成IplImage
return &dst; //返回IplImage指针
}
然后,将IplImage指针参数返回并转换成Emgucv中的Image对象
在这个过程中,要先将IplImage指针转换成MIplImage结构
/// <summary>
/// 将IplImage指针转换成MIplImage结构
/// </summary>
/// <param name="ptr">IplImage指针</param>
/// <returns>返回MIplImage结构</returns>
public static MIplImage IplImagePointerToMIplImage(IntPtr ptr)
{
return (MIplImage)Marshal.PtrToStructure(ptr, typeof(MIplImage));
}
然后在通过MIplImage结构这个桥梁,将IplImage指针转换成Emgucv中的Image对象
/// <summary>
/// 将IplImage指针转换成Emgucv中的Image对象;
/// 注意:这里需要您自己根据IplImage中的depth和nChannels来决定
/// </summary>
/// <typeparam name="TColor">Color type of this image (either Gray, Bgr, Bgra, Hsv, Hls, Lab, Luv, Xyz or Ycc)</typeparam>
/// <typeparam name="TDepth">Depth of this image (either Byte, SByte, Single, double, UInt16, Int16 or Int32)</typeparam>
/// <param name="ptr">IplImage指针</param>
/// <returns>返回Image对象</returns>
public static Image<TColor, TDepth> IplImagePointerToEmgucvImage<TColor, TDepth>(IntPtr ptrPic)
where TColor : struct, IColor
where TDepth : new()
{
MIplImage mi = IplImagePointerToMIplImage(ptrPic);
return new Image<TColor, TDepth>(mi.width, mi.height, mi.widthStep, mi.imageData);
}
将Emgucv传递Image类参数给Opencv的Mat类的操作,请点击这里