2017-02-01 2 views
0

Kinect V2カメラから赤外線フレームを取得しています。フレームはWritableBitmapの形で来るので、私は私が作ったこのコードでそれを変換しよう:WriteableBitmapからMatに変換して、CvInvoke.Imshowでウィンドウに表示しますか?

public Mat WritableBitmapToMat(WriteableBitmap writeBmp) 
{ 
    Bitmap bmp; 
    using (MemoryStream outStream = new MemoryStream()) 
    { 
     BitmapEncoder enc = new BmpBitmapEncoder(); 
     enc.Frames.Add(BitmapFrame.Create((BitmapSource)writeBmp)); 
     enc.Save(outStream); 
     bmp = new Bitmap(outStream); 
    } 

    Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height); 

    BitmapData bmpData = bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, bmp.PixelFormat); 

    IntPtr data = bmpData.Scan0; 

    int step = bmpData.Stride; 

    Mat mat = new Mat(bmp.Height, bmp.Width, Emgu.CV.CvEnum.DepthType.Cv32F, 4, data, step); 

    bmp.UnlockBits(bmpData); 

    return mat; 
} 

それは、変換に問題だ場合、私は知りませんが、私は、画像を表示しようとすると、このコードのウィンドウに:

例外:

CvInvoke.Imshow("window showing a picture", infraredMat); 

私はこのようになります例外を取得し終わる例外がスローさ:Emgu.CV.World.dllの「System.AccessViolationExceptionは」( "しようとしました保護されたメモリを読み書きすることができます。これは、多くの場合、他のメモリがc )。

はまた、私は私が得るすべての助けを事前にEmguCV 3.1とのKinect SDK 2.0

感謝を使用しています言及したいと思います。

+0

安全でないコード/メソッドを使用しましたか?メモリビットに直接アクセスしているため、問題がある可能性があります。 –

+0

「安全でないコードを許可する」というチェックボックスがチェックされています。私のメソッドの安全でない情報を追加する必要がありますか? – lolistic

+0

私のメソッドの安全でないinfrontを追加しようとしました。悲しいことに、働かなかった。 – lolistic

答えて

1

Kinect 2.0 SDKのInfraredBasics-WPFの例を見ると、IR画像はFrameReference.AcquireFrame()メソッドのushortベクトルに取り込まれます。次に、IntPtr infraredBuffer.UnderlyingBufferを使用して(安全でない方法で)フレームデータにアクセスし、1-Dベクトルを取得することができます。必要に応じて標準の2xforループを使用して、後で1-D行列を2-D行列に変換することができます。

このようにすれば、BitmapEncoderからデータにアクセスする必要がなくなります。さらに、SDKの標準例として与えられているので、IRフレームを取得するための推奨方法です。さらに、この例は、IR画像を表示する方法も含む。あなたの方法を使用する特定の方法/理由がない限り。 C#で

+0

お返事ありがとうございました!私がこのようにしたかった唯一の理由は、EmguCVコマンドでそれらを解析できることです。それは私が約3週間前にkinectとemguについて学ぶことから始めたので、私が何をしているのかを知っているわけではありません。 – lolistic

+0

私は実際にEmguCVで作業していませんが、あなたのポストはそれを調べたいと思っています:)私はC#の専門家ではありませんが、AcquireFrameまたはreader_FrameArrivedメソッドからデータを取得することができますさらなる処理に使用する。 –

+0

お寄せいただきありがとうございます!私はそれを試みます。私がそれを有効にすることができれば、私はアップデートを投稿します。 – lolistic

0

ビットマップは、簡単に以下のコードを使用してEMGUCVのマットに変換することができます。

Bitmap bmp = new Bitmap("FilePath");//Declare a Bitmap Object 
Image<Bgr, Byte> bmp_I = new Image<Bgr, byte>(bmp);//Creating an Image object in EMGUCV which can read Bitmap object. 
Mat converted_mat = bmp_I.Mat;//Convert Image object into Mat 
+0

提案していただきありがとうございますが、正確には私が探しているものではありません。 – lolistic

0

私は良い成功を収めて、このメソッドを使用します。

public static Mat ToMat(BitmapSource source) 
    { 
     if (source.Format == PixelFormats.Bgra32) 
     { 
      Mat result = new Mat(); 
      result.Create(source.PixelHeight, source.PixelWidth, DepthType.Cv8U, 4); 
      source.CopyPixels(Int32Rect.Empty, result.DataPointer, result.Step * result.Rows, result.Step); 
      return result; 
     } 
     else if (source.Format == PixelFormats.Bgr24) 
     { 
      Mat result = new Mat(); 
      result.Create(source.PixelHeight, source.PixelWidth, DepthType.Cv8U, 3); 
      source.CopyPixels(Int32Rect.Empty, result.DataPointer, result.Step * result.Rows, result.Step); 
      return result; 
     } 
     else if (source.Format == PixelFormats.Pbgra32) 
     { 
      Mat result = new Mat(); 
      result.Create(source.PixelHeight, source.PixelWidth, DepthType.Cv8U, 4); 
      source.CopyPixels(Int32Rect.Empty, result.DataPointer, result.Step * result.Rows, result.Step); 
      return result; 
     } 
     else 
     { 
      throw new Exception(String.Format("Conversion from BitmapSource of format {0} is not supported.", source.Format)); 
     } 
    } 

必要に応じて、これを微調整することができます。 ImShowが32ビット浮動小数点型のビットマップを扱うかどうかはわかりません。ビットマップは、通常、バイトでいっぱいです。私は間違っている可能性がありますが、私は何もフロートであることを表示しようとしたことはありません。

ダグ

関連する問題