3

Kinect からのカメラ フィードを WPF アプリケーションで表示しようとしています。ただし、画像は空白に見えます。

以下は、Kinect クラスにあるもののスニペットです。これはすべて正しく起動し、BitmapSource は正常に作成されたようです。

public delegate void FrameChangedDelegate(BitmapSource frame);
public event FrameChangedDelegate FrameChanged;


//this event is fired by the kinect service, and fires correctly

void sensor_AllFramesReady(object sender, AllFramesReadyEventArgs e)
    {
        using (ColorImageFrame colorFrame = e.OpenColorImageFrame())
        {
            if (colorFrame == null)
            {
                return;
            }

            byte[] pixels = new byte[colorFrame.PixelDataLength];

            colorFrame.CopyPixelDataTo(pixels);

            int stride = colorFrame.Width * 4;

            BitmapSource newBitmap = BitmapSource.Create(colorFrame.Width, colorFrame.Height,
                96, 96, PixelFormats.Bgr32, null, pixels, stride);
            counter++;

            //below is the call to the delegate

            if ( FrameChanged != null)
            {
                FrameChanged(newBitmap);
            }


        }
    }

これが私のViewModelにあるものです。

    void kinectService_FrameChanged(BitmapSource frame)
    {

        image = frame;
    }

    BitmapSource image;
    public BitmapSource Image
    {
        get { return this.image; }
        set
        {
            this.image = value;
            this.OnPropertyChanged("Image");
        }
    }

以下は、XAML ビューにあるものです。

<Image Canvas.Left="212" Canvas.Top="58" Height="150" Name="image1" Stretch="Fill"     Width="200" Source="{Binding Path=Image}"/>

すべてのイベントとプロパティが更新されているようです。私は何を間違っていますか?

4

3 に答える 3

2
image = frame;

次のようにする必要があります。

Image = frame;

そうしないと、プロパティの変更通知が発生しません。

于 2012-03-07T17:28:57.660 に答える
1

変更してみてください:

 void kinectService_FrameChanged(BitmapSource frame)
 {
    this.image = frame;
 }

 void kinectService_FrameChanged(BitmapSource frame)
 {
    this.Image = frame;
 }

プロパティを使用していないため、PropertyChangedイベントが呼び出されることはなく、UI は新しい画像値を取得する必要があることを知りません。

于 2012-03-07T17:29:48.963 に答える
1

よくわかりませんが、大文字を使用する必要はありませんか?

void kinectService_FrameChanged(BitmapSource frame)
{
   Image = frame;
}

追加するのを忘れました: これが WPF がスタックする理由です。これらすべての小さなトラップと落とし穴。バインディングが防止するはずのアプリケーションで「同期」の問題が発生することはめったにありませんでしたが、代わりに、バインディング自体に小さな問題がたくさん発生します。

于 2012-03-07T17:29:58.677 に答える