我正在做一个项目,我想使用 AForge.NET-Library 使用 Microsoft Kinect 跟踪骰子。该项目本身仅包含初始化 Kinect、获取 Colorframe 和应用一个滤色器等基础知识,但问题已经出现。所以这里是程序的主要部分:
void ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e)
{
using (ColorImageFrame colorFrame = e.OpenColorImageFrame())
{
if (colorFrame != null)
{
colorFrameManager.Update(colorFrame);
BitmapSource thresholdedImage =
diceDetector.GetThresholdedImage(colorFrameManager.Bitmap);
if (thresholdedImage != null)
{
Display.Source = thresholdedImage;
}
}
}
}
“colorFrameManager”对象的“更新”方法如下所示:
public void Update(ColorImageFrame colorFrame)
{
byte[] colorData = new byte[colorFrame.PixelDataLength];
colorFrame.CopyPixelDataTo(colorData);
if (Bitmap == null)
{
Bitmap = new WriteableBitmap(colorFrame.Width, colorFrame.Height,
96, 96, PixelFormats.Bgr32, null);
}
int stride = Bitmap.PixelWidth * Bitmap.Format.BitsPerPixel / 8;
imageRect.X = 0;
imageRect.Y = 0;
imageRect.Width = colorFrame.Width;
imageRect.Height = colorFrame.Height;
Bitmap.WritePixels(imageRect, colorData, stride, 0);
}
'getThresholdedImage' 方法如下所示:
public BitmapSource GetThresholdedImage(WriteableBitmap colorImage)
{
BitmapSource thresholdedImage = null;
if (colorImage != null)
{
try
{
Bitmap bitmap = BitmapConverter.ToBitmap(colorImage);
HSLFiltering filter = new HSLFiltering();
filter.Hue = new IntRange(335, 0);
filter.Saturation = new Range(0.6f, 1.0f);
filter.Luminance = new Range(0.1f, 1.0f);
filter.ApplyInPlace(bitmap);
thresholdedImage = BitmapConverter.ToBitmapSource(bitmap);
}
catch (Exception ex)
{
System.Console.WriteLine(ex.Message);
}
}
return thresholdedImage;
}
现在程序变慢了很多/执行此行时没有响应:
filter.ApplyInPlace(bitmap);
所以我已经阅读了这个线程(使用 AForge 对 Kinect 视频进行 C# 图像处理),我尝试了 EMGU,但由于内部异常,我无法让它工作,而且线程启动器自四个月以来就没有在线我的问题有看看他的工作代码没有得到回答。现在首先我对执行缓慢的原因很感兴趣
filter.ApplyInPlace(bitmap);
这个图像处理真的那么复杂吗?或者这可能是我的环境问题?其次我想问一下跳帧是否是一个好的解决方案?或者最好每隔 - 例如 - 500毫秒使用轮询和打开帧。非常感谢!