基本的に、Kinect (Microsoft の新しい Kinect 1.0 SDK) で openCV を使用しようとしています。私は C# と Kinect の両方に非常に慣れていません。しかし、私がやりたいのは、EMGU (C# の openCV ラッパー) を使用して顔認識に kinect を使用することです。これまでのところ、kinect からビデオ ストリームを正常にキャプチャし、それを EMGU Image<> に変換してから、Byte[] 配列に変換して、BitmapSource を使用して画像を画面に表示できるようにしました。
それは問題なく動作しますが、実際に Image<> クラスで画像処理を実行しようとすると問題が発生するようです。実際には問題なく処理されているように見えますが、それほど高速ではありません。これは必ずしも私にとっては問題ではありませんが、BitmapSource がまったく表示されなくなりました。
顔を検出するコードの例を次に示します。
img = new Image<Bgr, byte>(clone);
haar = new HaarCascade("directory");
Image<Gray, Byte> gray;
using (HaarCascade face = new HaarCascade("blablabla.xml"))
using (HaarCascade eye = new HaarCascade("blarg.xml"))
{
using ( gray = img.Convert<Gray, Byte>()) //Convert it to Grayscale
{
MCvAvgComp[] facesDetected = face.Detect(gray, 1.1, 1, mgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new System.Drawing.Size(img.Width / 8, img.Height / 8));
foreach (MCvAvgComp f in facesDetected)
{
img.Draw(f.rect, new Bgr(System.Drawing.Color.Blue), 2);
imgDoneProc = img.ToBitmap();
}
}
}
次に、 BitmapSource.Create() を使用します。
BitmapSource bmapa = BitmapSource.Create(PImage.Width, PImage.Height, 96, 96, PixelFormats.Bgr32, null, bmpBytes, PImage.Width * PImage.BytesPerPixel);
image1.Source = bmapa;
(PImage は Kinect からのストリームです。bmpBytes は Image<> から変換された Byte[] です)
したがって、画像処理を行うコードをコメントアウトすると、前後の変換はすべて正常に機能します。画像の proc コードを追加すると、コンソールに有用なデータを書き込むことができますが、画像が表示されません。「bmapa」がすぐに更新されないことにも気付きました。これが、image1 に何も表示されていないこと以外の唯一の顕著な違いです。
それで、私は BitmapSource を間違って使用していますか、それともコードを高速化する方法、またはおそらく BitmapSource の「リフレッシュレート」を遅くする方法はありますか? データ構造間で変換しているときは、kinect から安定したストリームが得られ、すべて正常に動作するためです。
ありがとう、ブレント