OpenCV是一套使用C/C++编写的开源计算机视觉库,全称Open Computer Vision,因其高效、全面,在计算机视觉领域应用极广。其在C#下的包装有多种,最常用的是Emgu。
本人最近在写一套计算机视觉处理软件,用的就是C# + Emgu,因为用到的OpenCV方法就那么几个(大概10多个),为了这些为数不多的方法而带着数MB的Emgu DLL,心里很是不爽,于是乎萌生了将这些方法全部用C# unsafe代码重写的想法,反正OpenCV是开源的,算法可以写成一样的,效率上应该差不到哪去。
下面是我自己写的一个图像类:
///<summary>灰度图像处理类,作者:wmesci</summary>
unsafe class Image :CriticalHandle, IDisposable
{
[DllImport("kernel32.dll")]
static extern IntPtr LocalAlloc(int flags, int size);
[DllImport("kernel32.dll")]
static extern IntPtr LocalFree(IntPtr memBlock);
[DllImport("kernel32.dll", EntryPoint = "RtlMoveMemory")]
static extern unsafe void CopyMemory(byte* dst, byte* src, int count);
[DllImport("kernel32.dll", EntryPoint = "RtlMoveMemory")]
static extern unsafe void CopyMemory(byte* dst, IntPtr src, int count);
[DllImport("kernel32.dll", EntryPoint = "RtlMoveMemory")]
static extern unsafe void CopyMemory(byte* dst, byte[] src, int count);
const byte Max = 255;
const byte Min = 0;
public Image(int width, int height)
: base(IntPtr.Zero)
{
if (width <= 0 || height <= 0)
throw new ArgumentOutOfRangeException();
Width = width;
Height = height;
Length = Width * Height;
base.SetHandle(LocalAlloc(0x40, width * height));
Pointer = (byte*)handle.ToPointer();
}
public Image(int width, int height, byte[] dat)
: this(width, height)
{
if (dat != null)
{
CopyMemory(Pointer, dat, Length);
}
}
public Image(int width, int height, byte* dat)
: this(width, height)
{
CopyMemory(Pointer, dat, Length);
}
public Image(int width, int height, IntPtr dat)
: this(width, height)
{
CopyMemory(Pointer, dat, Length);
}
public readonly int Width;
public readonly i