Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to display webcam images captured with Emgu?

Tags:

I'm currently working on a project that use Facial Recognition. I therefore need a way to display the webcam images to the user so he can adjust his face.

I've been trying a lot of things to get images from the webcam using as less CPU as possible:

  • VideoRendererElement
  • WPFMediaKit
  • DirectShow-Lib

But none of them were fine... Either way too slow or too CPU resources consuming.

Then I tried the Emgu library and I felt great about it. At first, I tried it in a Windows Form project and was updating the image in a Picture Box. But then, when I tried to integrate it in my WPF Project I got stuck on how to pass my image to my Image control..

Right now, I've the following source code:

<Window x:Class="HA.FacialRecognition.Enroll.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Width="800" Height="600"
        Loaded="Window_Loaded" Closing="Window_Closing">
    <Grid>
        <Image x:Name="webcam" Width="640" Height="480" >
            <Image.Clip>
                <EllipseGeometry  RadiusX="240" RadiusY="240">
                    <EllipseGeometry.Center>
                        <Point X="320" Y="240" />
                    </EllipseGeometry.Center>
                </EllipseGeometry>
            </Image.Clip>
        </Image>
    </Grid>
</Window>

And the code behind:

private Capture capture;
private System.Timers.Timer timer;

public Window1()
{
    InitializeComponent();
}

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    capture = new Capture();
    capture.FlipHorizontal = true;

    timer = new System.Timers.Timer();
    timer.Interval = 15;
    timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
    timer.Start();
}

void timer_Elapsed(object sender, ElapsedEventArgs e)
{
    using (Image<Bgr, byte> frame = capture.QueryFrame())
    {
        if (frame != null)
        {
            var bmp = frame.Bitmap;
            // How do I pass this bitmap to my Image control called "webcam"?
        }
    }
}

private void Window_Closing(object sender, CancelEventArgs e)
{
    if (capture != null)
    {
        capture.Dispose();
    }
}

My guess was to use BitmapSource/WriteableBitmap but I did not get them working...

Thanks!