好的,所以基本上我正在尝试将 openCV 与 Kinect(微软的新 Kinect 1.0 SDK)一起使用。我对 C# 和 Kinect 都很陌生。但我想做的是使用 kinect 使用 EMGU(C# 的 openCV 包装器)进行面部识别。到目前为止,我已经成功地从 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 获得稳定的数据流,并且一切正常。
谢谢,布伦特