EMGU падает при попытке записать серое изображение в VideoWriter
Может кто-нибудь сказать мне, почему EMGU выдает исключение при попытке записать изображение в градациях серого? Вот что я делаю:
gCam.StartAcquisition (); Debug.WriteLine ("запись...");
//Bitmap safeImage = new Bitmap(xiImageWidth, xiImageHeight,
//System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
Bitmap safeImage = new Bitmap(xiImageWidth, xiImageHeight,
System.Drawing.Imaging.PixelFormat.Format16bppGrayScale );
//Emgu.CV.Image<Gray, Byte> currentFrame;
Emgu.CV.Image<Gray, UInt16> currentFrame;
gCam.GetImage(safeImage, XI_CAPTURE_TIMEOUT);
//currentFrame = new Image<Gray, Byte>(safeImage);
currentFrame = new Image<Gray, UInt16>(safeImage);
currentFrame.Save("testImage.bmp");
startTime = DateTime.Now;
if (emguVideoWriter.Ptr != IntPtr.Zero)
{
emguVideoWriter.WriteFrame(currentFrame);
}
Когда я использую MONO8 и Image, у меня нет проблем, но если я пытаюсь перейти на 16-битную версию, я получаю следующее исключение:
A first chance exception of type 'System.ArgumentException' occurred in System.Drawing.dll
exception caught while recording a frame! ex=System.ArgumentException: Parameter is not valid.
at System.Drawing.Bitmap.GetPixel(Int32 x, Int32 y)
at Emgu.CV.Image`2.set_Bitmap(Bitmap value) in C:\Emgu\emgucv-windows-x64 2.4.0.1717\Emgu.CV\Image.cs:line 2866
at Emgu.CV.Image`2..ctor(Bitmap bmp) in C:\Emgu\emgucv-windows-x64 2.4.0.1717\Emgu.CV\Image.cs:line 213
Это сводит меня с ума, потому что я не понимаю, почему я не могу записать 16-битные изображения. Я надеялся, что VideoWriter сделает мою жизнь проще, но это только усложняет ситуацию. Я почти чувствую, что просто выписываю необработанные байты в этот момент!
1 ответ
Решение
Я думаю, что, возможно, нашел ответ. Строка 2669 из Image.cs (исходный код EMGU) говорит следующее:
/*
//PixelFormat.Format16bppGrayScale is not supported in .NET
else if (typeof(TColor) == typeof(Gray) && typeof(TDepth) == typeof(UInt16))
{
return new Bitmap(
size.width,
size.height,
step,
PixelFormat.Format16bppGrayScale;
scan0);
}*/
Не поддерживается! Я хотел бы, чтобы исключение сказало это!