将位图图像(Kinect v2)转换为Emgu Image时,“不支持URI格式” [英] “URI formats are not supported” when converting Bitmap image (Kinect v2) to Emgu Image
问题描述
我正在开发一个项目,我想使用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格式。
有没有人有想法,或者有人能告诉我如何以其他方式做到这一点?
下面你会发现代码我使用。
I am working on an project where I want to use Kinect camera 2 (SDK v2), with Emgu library (2.4.10.1940).
First I converted the Kinect ColorFrame
to BitmapSource
and then from BitmapSource
to Drawing.Bitmap.
When I try to convert from Drawing.Bitmap
to Image<Bgr, Byte>
, I get an "A first chance exception of type 'System.ArgumentException' occurred in mscorlib.dll. Additional information: URI formats are not supported".
Does anyone has an idea, or can someone prompt me of how I can do it with another way?
Below you will find the code I used.
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);
}
}
推荐答案
大家好我发现问题并解决了。首先,我忘了将x86和x64文件夹从Emgu \ bin复制到Visual Studio目录的Debug文件夹。此外,将Media.BitmapSource
转换为Emgu.CV.Image
并不是最好的主意,所以读完一本书后( James Ashley - 使用Microsoft SDK开始Kinect编程)我可以将Drawing.Bitmap
转换为Emgu.CV.Image
。< br $>
Hi guys I found the problem and solve it. First I forgot to copy the x86 and x64 folders from Emgu\bin to Debug folder of the Visual Studio directory. Moreover, convertingMedia.BitmapSource
toEmgu.CV.Image
isn't the best idea so after reading a book (James Ashley - Beginning Kinect Programming with Microsoft SDK) I could convertDrawing.Bitmap
toEmgu.CV.Image
.
private void InitializeKinect()
{
KinectSensor Sensor = KinectSensor.GetDefault();
FrameDescription frameDescription = Sensor.ColorFrameSource.FrameDescription;
ColorFrameReader FrameReader = Sensor.ColorFrameSource.OpenReader();
FrameReader.FrameArrived += FrameReader_FrameArrived;
}
void FrameReader_FrameArrived(object sender, ColorFrameArrivedEventArgs e)
{
using (ColorFrame frame = e.FrameReference.AcquireFrame())
{
if (frame == null)
return;
var width = frame.FrameDescription.Width;
var heigth = frame.FrameDescription.Height;
var data = new byte[width * heigth * System.Windows.Media.PixelFormats.Bgra32.BitsPerPixel / 8];
frame.CopyConvertedFrameDataToArray(data, ColorImageFormat.Bgra);
var bitmap = new System.Drawing.Bitmap(width, height, PixelFormat.Format32bppRgb);
var bitmapData = bitmap.LockBits(
new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height),
ImageLockMode.WriteOnly,
bitmap.PixelFormat);
Marshal.Copy(data, 0, bitmapData.Scan0, data.Length);
bitmap.UnlockBits(bitmapData);
Emgu.CV.Image<bgr,> imageFrame = new Image<bgr,>(bitmap);
}
}
这篇关于将位图图像(Kinect v2)转换为Emgu Image时,“不支持URI格式”的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!