使用Kinect和AForge进行图像处理

时间:2013-04-14 10:34:59

标签: image-processing kinect aforge

我正在开发一个项目,我希望使用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'对象的'Update'方法如下所示:

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);

所以我已经阅读了这个帖子(C# image processing on Kinect video using AForge)并且我尝试了EMGU,但由于内部异常并因为线程启动器不在线,所以我无法让它工作,因为我的问题有四个月了看看他的工作代码没有回答。 现在我首先想知道执行缓慢的原因是什么

filter.ApplyInPlace(bitmap);

这种图像处理真的如此复杂吗?或者这可能是我的环境问题? 其次,我想问一下跳帧是否是一个很好的解决方案?或者最好每次使用轮询和打开框架 - 例如 - 500毫秒。 非常感谢你!

1 个答案:

答案 0 :(得分:1)

HSL过滤器不会减慢计算速度,也不是复杂的过滤器。 我在320x240图像中使用它,30 fps没问题。

问题可能在于计算图像的分辨率或帧速率过高!

如果图像的分辨率很高,我建议在任何过滤器应用程序之前调整它的大小。 我认为20帧(也可能更低)的帧率足以跟踪骰子。