C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: c# wpfでのキネクトによる静止画の撮影


(過去ログ 107 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■63744 / inTopicNo.1)  c# wpfでのキネクトによる静止画の撮影
  
□投稿者/ poigumi (7回)-(2012/10/03(Wed) 16:53:40)

分類:[C#] 

フォームアプリケーションからwpfに乗り換えようと思いまして勉強を始めたのですが、思いのほか難しく苦戦する毎日です。そこで皆さんに教えていただきたいのですが、wpfでキネクトを使い静止画を撮りたいので、どのようなプログラムを作ればいいか教えて下さい。主に何をするか下にまとめ、フォームアプリケーションで作った際のソースコードを下に書きます。



☆何がしたいか☆
・1秒ごとにキネクトに写っている風景を撮影
・撮影した画像を特定のファイル(新しいファイルなど)に.bmpで保存



☆フォームアプリケーションで作った際のソースコード☆

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

// ビットマップを生成するため
using System.Drawing.Imaging;

// Kinectのセンサクラス
// Microsoft.Kinectを参照に追加
using Microsoft.Kinect;

// メモリ管理の最適化のため
// System.Runtime.Serializationを参照に追加
using System.Runtime.InteropServices;

namespace Formimagecapture
{
    public partial class Form1 : Form
    {
        /// <summary>
        /// Kinectのセンサクラス
        /// </summary>
        KinectSensor kinect;

        /// <summary>
        /// Kinectから取得したRGBデータ
        /// (byte型配列)
        /// </summary>
        byte[] imageData;

        /// <summary>
        /// 実画像
        /// (ビットマップ形式)
        /// </summary>
        Bitmap imageBitmap;

        public Form1()
        {
            InitializeComponent();

            // ビットマップの初期化
            imageBitmap = new Bitmap(640, 480);

            // kinectの初期化
            kinect = KinectSensor.KinectSensors[0];

            // カラー画像の取得を開始する
            kinect.ColorFrameReady += new EventHandler<ColorImageFrameReadyEventArgs>(ColorFrameReady);
            kinect.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30);

            // kinectを起動する
            kinect.Start();

        }
        private void timer1_Tick(object sender, EventArgs e)
        {
            // 画像の保存
            imageBitmap.Save(DateTime.Now.Year + "-" + DateTime.Now.Month + "-" + DateTime.Now.Day + "-" + DateTime.Now.Hour + "-" + DateTime.Now.Minute + "-" + DateTime.Now.Second + ".bmp");
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //タイマーを開始する
            timer1.Start();
        }
       
        private void button2_Click(object sender, EventArgs e)
        {
            timer1.Stop();
        }

        void ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e)
        {
            // kinectからカラーイメージを取得
            ColorImageFrame image = e.OpenColorImageFrame();

            // imageがnullだった場合処理しない
            if (image != null)
            {
                // imageData配列の初期化
                imageData = new byte[image.PixelDataLength];

                // imageのピクセルデータをpixelDataへコピーする
                image.CopyPixelDataTo(imageData);

                // imageDataからビットマップへ変換する
                imageBitmap = toBitmap(imageData, imageBitmap.Width, imageBitmap.Height);

                // ピクチャーボックスへ反映
                pictureBox1.Image = imageBitmap;

            }
        }

        /// 取得データをビットマップデータに変換
        /// </summary>
        /// <param name="pixels">kinectで取得したbyte[]配列</param>
        /// <param name="width">横サイズ</param>
        /// <param name="height">縦サイズ</param>
        /// <returns></returns>
        public static Bitmap toBitmap(byte[] pixels, int width, int height)
        {
            // pixelsに何も入っていない場合nullを返す
            if (pixels == null)
                return null;

            // ビットマップの初期化
            var bitmap = new Bitmap(width, height, PixelFormat.Format32bppRgb);

            // システムメモリへロック
            var data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat);

            // メモリデータのコピー
            Marshal.Copy(pixels, 0, data.Scan0, pixels.Length);

            // システムメモリのロック解除
            bitmap.UnlockBits(data);

            return bitmap;
        }
    }
}

皆さんよろしくお願いします。

引用返信 編集キー/
■63745 / inTopicNo.2)  Re[1]: c# wpfでのキネクトによる静止画の撮影
□投稿者/ オショウ (26回)-(2012/10/05(Fri) 10:12:12)
No63744 (poigumi さん) に返信
> フォームアプリケーションからwpfに乗り換えようと思いまして勉強を始めたのですが、思いのほか難しく苦戦する毎日です。そこで皆さんに教えていただきたいのですが、wpfでキネクトを使い静止画を撮りたいので、どのようなプログラムを作ればいいか教えて下さい。主に何をするか下にまとめ、フォームアプリケーションで作った際のソースコードを下に書きます。

  で、そのコードを実行したら、どうなったのでしょうか?
  不具合の内容によって、対処が異なるので、答えようがないです。

  また、キネクトを保有していてこのカキコを読み、答えてくれる人が
  どれだけいるのでしょうか・・・そうそういないと思いますが。

以上。
引用返信 編集キー/
■63762 / inTopicNo.3)  Re[2]: c# wpfでのキネクトによる静止画の撮影
□投稿者/ poigumi (9回)-(2012/10/06(Sat) 14:04:43)
No63745 (オショウ さん) に返信
> ■No63744 (poigumi さん) に返信

色々と説明が足りないようですいませんでした。これから質問していく際には問題を明確にしていこうと思います。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -