0

Kinect ColorImageFrame とスケルトン表現を表示するために WPF を使用するプロジェクトに取り組んでいます。また、その 2 つのビデオを録画する必要があります。

これら 2 つの画像を (EmguCV を使用して) 表示および記録することはできますが、パフォーマンスの問題がいくつかあります。私のコードのこの部分がパフォーマンスの低下の原因のようです。

private void DrawSkeleton(Skeleton[] skeletons)
    {
        using (System.Drawing.Bitmap skelBitmap = new System.Drawing.Bitmap(640, 480))
        {
            foreach (Skeleton S in skeletons)
            {
                if (S.TrackingState == SkeletonTrackingState.Tracked)
                {
                    DrawBonesAndJoints(S,skelBitmap);                        
                }
                else if (S.TrackingState == SkeletonTrackingState.PositionOnly)
                {

                }
            }
            _videoArraySkel.Add(ToOpenCVImage<Bgr, Byte>(skelBitmap));
            BitmapSource source = ToWpfBitmap(skelBitmap);
            this.skeletonStream.Source = source;       
        }            
    }

より正確には、ウィンドウに表示できる ToWpfBitmap から:

public static BitmapSource ToWpfBitmap(System.Drawing.Bitmap bitmap) 
    {
        using (MemoryStream stream = new MemoryStream()) 
        {
            bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);
            stream.Position = 0;
            BitmapImage result = new BitmapImage();
            result.BeginInit();
            // According to MSDN, "The default OnDemand cache option retains access to the stream until the image is needed."
            // Force the bitmap to load right now so we can dispose the stream.
            result.CacheOption = BitmapCacheOption.OnLoad;
            result.StreamSource = stream;
            result.EndInit();
            result.Freeze();
            return result;
        }
    }

パフォーマンスの低下の特徴は次のとおりです。 - ウィンドウに表示されるビデオが流暢ではなくなりました。

この問題の原因を教えてください。

4

2 に答える 2

0

キューのようなバッファにデータを保持しながら、別のスレッドでメモリ書き込み i/o を実行しようとしましたか?

于 2014-03-28T17:00:32.990 に答える