2

我正在做一个项目,我想使用 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毫秒使用轮询和打开帧。非常感谢!

4

1 回答 1

1

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

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

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

于 2013-04-21T20:50:22.263 回答