我正在开发一个项目,我想使用 Kinect 相机 2(SDK v2)和 Emgu 库(2.4.10.1940)。
首先我将 Kinect 转换ColorFrame
为BitmapSource
,然后从转换BitmapSource
为Drawing.Bitmap
。当我尝试从 转换为Drawing.Bitmap
时Image<Bgr, Byte>
,我得到一个“在 mscorlib.dll 中发生'System.ArgumentException' 类型的第一次机会异常。附加信息:不支持 URI 格式”。
有没有人有想法,或者有人可以提示我如何用另一种方式做到这一点?
您将在下面找到我使用的代码。
public MainWindow()
{
InitializeComponent();
kinectSensor = KinectSensor.GetDefault();
if (kinectSensor == null)
return;
FrameDescription colorFrameDescription = kinectSensor.ColorFrameSource.FrameDescription;
colorReader = kinectSensor.ColorFrameSource.OpenReader();
colorPixels = new byte[colorFrameDescription.Width * colorFrameDescription.Height * BytePerPixel];
colorBitmap = new WriteableBitmap(colorFrameDescription.Width, colorFrameDescription.Height, 96.0, 96.0, PixelFormats.Bgr32, null);
kinectSensor.Open();
colorReader.FrameArrived += colorReader_FrameArrived;
kinectSensor.IsAvailableChanged += kinectSensor_IsAvailableChanged;
StatusText = kinectSensor.IsAvailable ? "Running" : "Kinect sensor not available";
}
void colorReader_FrameArrived(object sender, ColorFrameArrivedEventArgs e)
{
using (ColorFrame colorFrame = e.FrameReference.AcquireFrame())
{
if (colorFrame == null)
return;
FrameDescription colorFrameDesc = colorFrame.FrameDescription;
// Check if the pixelWidth and pixelHeight is right
if ((colorFrameDesc.Width == colorBitmap.PixelWidth) && (colorFrameDesc.Height == colorBitmap.PixelHeight))
{
// Check if the image format is right.
if (colorFrame.RawColorImageFormat == ColorImageFormat.Bgra)
colorFrame.CopyRawFrameDataToArray(this.colorPixels);
else
colorFrame.CopyConvertedFrameDataToArray(this.colorPixels, ColorImageFormat.Bgra);
// Write pixels to BitmapSource format
colorBitmap.WritePixels(new Int32Rect(0, 0, colorFrameDesc.Width, colorFrameDesc.Height),
colorPixels,
colorFrameDesc.Width * BytePerPixel,
0);
// Convert to Drawing.Bitmap image
System.Drawing.Bitmap bmap = BitmapImage2Bitmap(colorBitmap);
// Convert to Emgu image (This is where I get my error).
Emgu.CV.Image<Bgr, byte> imageFrame = new Image<Bgr,byte>(bmap);
}
}
}
private System.Drawing.Bitmap BitmapImage2Bitmap(BitmapSource bitmapImage)
{
using (MemoryStream outStream = new MemoryStream())
{
BitmapEncoder enc = new BmpBitmapEncoder();
enc.Frames.Add(BitmapFrame.Create(bitmapImage));
enc.Save(outStream);
System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(outStream);
return new System.Drawing.Bitmap(bitmap);
}
}