I create an application that captures video frames from a camera (30fps @ 640x480), processes them, and then displays them in a Windows form. At first I used DrawImage (see code below), but the performance was terrible. Even with the processing step disabled, the best I can get is 20 frames per second on a 2.8 GHz Core 2 Duo processor. Double buffering is enabled in Windows form, otherwise I am tearing.
Note. The image used is a raster image format Format24bppRgb. I know that DrawImage should be faster with Format32bppArgb formatted image, but I'm limited to the format that comes out of the frame grabber.
private void CameraViewForm_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
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 (. ), . 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. , .