1

こんにちは、私はBitmapSourceをKinectRGBカラーストリームからビットマップに変換しようとしています。私はnullになっています。Kinect for Windows SDK 1.6、Visual Studio 2012、Windows 7 Ultimate 64ビット、EmguCV2.4.2.1777を使用しています。コードは次のとおりです。

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

            if ( colorFrame != null )
            {
                this.colorPixels = new byte[colorFrame.PixelDataLength];

                colorFrame.CopyPixelDataTo( this.colorPixels );

                int stride = colorFrame.Width * 4;

                colorBmp = BitmapSource.Create( 
                    colorFrame.Width, 
                    colorFrame.Height, 
                    96, 
                    96, 
                    PixelFormats.Bgr32, 
                    null, 
                    colorPixels,
                    stride 
                );

                currentColorFrame = new Image<Bgr, Byte>( colorBmp.ToBitmap() );

                this.imgOutput.Source = ImageHelpers.ToBitmapSource( currentColorFrame ); 
            }
        }           
    }

ヘルパーメソッド:

   public static System.Drawing.Bitmap ToBitmap(this BitmapSource bitmapsource)
    {
        System.Drawing.Bitmap bitmap;
        using ( var outStream = new MemoryStream() )
        {
            // from System.Media.BitmapImage to System.Drawing.Bitmap
            BitmapEncoder enc = new BmpBitmapEncoder();
            enc.Frames.Add( BitmapFrame.Create( bitmapsource ) );
            enc.Save( outStream );
            bitmap = new System.Drawing.Bitmap( outStream );
            return bitmap;
        }         
    }


    [DllImport("gdi32")]
    private static extern int DeleteObject(IntPtr o);

    /// <summary>
    /// Convert an IImage to a WPF BitmapSource. The result can be used in the Set Property of Image.Source
    /// </summary>
    /// <param name="image">The Emgu CV Image</param>
    /// <returns>The equivalent BitmapSource</returns>
    public static BitmapSource ToBitmapSource(IImage image)
    {
        using (System.Drawing.Bitmap source = image.Bitmap)
        {
            IntPtr ptr = source.GetHbitmap(); //obtain the Hbitmap

            BitmapSource bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                ptr,
                IntPtr.Zero,
                Int32Rect.Empty,
                System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());

            DeleteObject(ptr); //release the HBitmap
            return bs;
        }
    }

私の間違いを指摘するか、できるだけ早く提案をしてください。

4

3 に答える 3

0

ToBitmapメソッドのreturnステートメントを次のように変更してみてください。こちらもご覧ください

return (Bitmap)Image.FromStream(stream)

ToBitmapSourceのCreateBitmapSourceFromHBitmapがメモリリークを引き起こす可能性があることに注意してください。この投稿を参照してください。ビットマップをビットマップソースに変換する方法は他にもたくさんありますが、私の経験では、これより高速な方法はありません。

于 2013-01-05T13:51:46.587 に答える
0

クイック検索で、 を に変換する方法に関するリソースがいくつか見つかりBitmapSourceましたBitmap

BitmapSource と Bitmap の間で変換する良い方法はありますか?

http://snipplr.com/view/63090/how-to-convert-bitmapsource-to-bitmap/

https://gist.github.com/916300

それらはすべて一般的なテーマに従いますが、わずかに異なります。

于 2013-01-05T14:58:01.473 に答える
0

64 ビット OS を使用しているため、次のファイルも参照していただければ幸いです (EMGU CV バージョン >=2.4 の場合)。

cudart64_42_9.dll, cvextern.dll, npp64_42_9.dll

これは、64 ビット ビルドを行っていない場合に、64 ビット OS で emgucv を使用するのに役立ちます。それ以外は、コードは問題なく見えます。

于 2013-01-12T18:58:36.867 に答える