我正在构建一个应用程序,它从相机(30fps @ 640x480)捕获视频帧,处理它们,然后在 Windows 窗体上显示它们。我最初使用的是 DrawImage(见下面的代码),但性能很糟糕。即使禁用了处理步骤,在 2.8GHz Core 2 Duo 机器上我能得到的最好效果也是 20fps。在 Windows 窗体上启用了双缓冲,否则我会撕裂。
注意:使用的图像是格式 Format24bppRgb 的位图。我知道 DrawImage 应该使用 Format32bppArgb 格式的图像更快,但我受到来自图像采集卡的格式的限制。
private void CameraViewForm_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
// Maximize performance
g.CompositingMode = CompositingMode.SourceOver;
g.PixelOffsetMode = PixelOffsetMode.HighSpeed;
g.CompositingQuality = CompositingQuality.HighSpeed;
g.InterpolationMode = InterpolationMode.NearestNeighbor;
g.SmoothingMode = SmoothingMode.None;
g.DrawImage(currentFrame, displayRectangle);
}
我尝试将 Managed DirectX 9 与 Textures 和 Spites 一起使用(见下文),但性能更差。我对 DirectX 编程非常陌生,所以这可能不是最好的 DirectX 代码。
private void CameraViewForm_Paint(object sender, PaintEventArgs e)
{
device.Clear(ClearFlags.Target, Color.Black, 1.0f, 0);
device.BeginScene();
Texture texture = new Texture(device, currentFrame, Usage.None, Pool.Managed);
Rectangle textureSize;
using (Surface surface = texture.GetSurfaceLevel(0))
{
SurfaceDescription surfaceDescription = surface.Description;
textureSize = new Rectangle(0, 0, surfaceDescription.Width, surfaceDescription.Height);
}
Sprite sprite = new Sprite(device);
sprite.Begin(SpriteFlags.None);
sprite.Draw(texture, textureSize, new Vector3(0, 0, 0), new Vector3(0, 0, 0), Color.White);
sprite.End();
device.EndScene();
device.Present();
sprite.Dispose();
texture.Dispose();
}
我需要它才能在 XP、Vista 和 Windows 7 上工作。我不知道是否值得尝试 XNA 或 OpenGL。这似乎应该是一件非常简单的事情。