4

kinect深度センサーの画像をpngファイルに保存しようとしています。RGBカメラでこれを撮ってみましたが、問題ありませんでした。見逃したことはありますか?PS私は、RGBと深度画像の両方の表示にKinectToolKitの機能を使用しています。

WriteableBitmap depthBitmap;
DepthStreamManager dsm;
dsm = new DepthStreamManager();
kinect.DepthStream.Enable(DepthImageFormat.Resolution640x480Fps30);
kinect.DepthFrameReady += kinect_DepthFrameReady;
depthBitmap = new WriteableBitmap(kinect.DepthStream.FrameWidth,this.kinect.DepthStream.FrameHeight, 96.0, 96.0, PixelFormats.Gray16, null);
private string TakeImage(int x)
    {
        if (x == 0)
        {
            BitmapEncoder encoder = new PngBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(this.depthBitmap));
            string myPhotos = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
            string path = System.IO.Path.Combine(myPhotos, "Image 1.png");
            try
            {
                using (FileStream fs = new FileStream(path, FileMode.Create))
                {
                    encoder.Save(fs);
                }


            }
            catch (IOException details)
            {
                Console.Write(details.ToString());

            }
            if (path == null)
                return "Image was not taken.";
            else
                return path;
        }}
4

3 に答える 3

2

私自身の問題の解決策:

KinectのToolKitを使用して、実際には、ColorStreamManagerまたはDepthStreamManagerのWritableBitmapを取得できる書き込み可能なビットマップ関数を提供しました。以前の私のエラーは、Kinectの固有の表示メソッドを使用していなかったため、writeablebitmapが確実に空になることでした。これは私の固定コードです。

WriteableBitmap wmp;
            wmp = cis.Bitmap;
            BitmapEncoder encoder = new PngBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(wmp));
            string path = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop),"Image 1.png");
            try
            {
                using (FileStream fs = new FileStream(path, FileMode.Create))
                {
                    encoder.Save(fs);
                }
            }
            catch (IOException ioe)
            {
                Console.WriteLine(ioe.ToString());
            }
            return path;
于 2012-09-04T02:47:04.317 に答える
2

Coding4Fun Kinectツールキットを使用する場合は、ImageFrameオブジェクトを使用できると思います。ImageFrameオブジェクトをビットマップに変換でき、そこから問題なくPNGとして保存できるはずです。

ソリューションへの長い道のりのビットですが、私は現在、Kinectのものを搭載したマシンを使用していません。

編集:WinFormsを使用している場合は、Coding4FunツールキットメソッドImageFrame.ToBitmap()を使用して、そこからPNGとして保存するだけです。

コードは次のようになります。

private void saveAsPNG(ImageFrame myImageFrame, string path)
{
   Bitmap bmp = myImageFrame.ToBitmap();

   bmp.Save(path, System.Drawing.Imaging.ImageFormat.Png);

   bmp.Dispose();
}
于 2012-08-31T08:19:58.167 に答える
0

WriteableBitmapも必要ありません。pixeldataを保持するBitmapSourceを備えたエンコーダーのみ

using Microsoft.Kinect;
using System.Windows.Media; // WindowsBase
using System.Windows.Media.Imaging; //PresentationCore

..。

static void sensor_DepthFrameReady(object sender, DepthImageFrameReadyEventArgs e)
    {

        DepthImageFrame DIF = e.OpenDepthImageFrame();
        if (DIF == null){return;}            

        short[] pixels = new short[DIF.PixelDataLength];
        DIF.CopyPixelDataTo(pixels);

        if (check == 0)
        {
            int stride = DIF.Width * DIF.BytesPerPixel;
            BitmapEncoder encoder = new PngBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(BitmapSource.Create(
                DIF.Width, DIF.Height, 96, 96, PixelFormats.Gray16, null, pixels, stride)));

            string path = System.IO.Path.Combine(
                Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "kimage.png");

            try
            {
                using (FileStream fs = new FileStream(path, FileMode.Create))
                {
                    encoder.Save(fs);
                }
            }
            catch (IOException ioe)
            {
                Console.WriteLine(ioe.ToString());
            }
            check = 1;
        }}

環境:

  • Visual Studio 2012 Express
  • Microsoft.Kinectライブラリ1.7.0.0
  • エンコーダーにはアセンブリSystem.Xamlが必要です
于 2013-08-25T20:31:10.373 に答える