protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            RequestWindowFeature(WindowFeatures.NoTitle);
            bool cameraPreviewCallbackWithBuffer = false;

            SetContentView(Resource.Layout.CameraPreviewLayout);

            _bgrBuffers           = new ImageBufferFactory <Mat>(size => new Mat(size.Height, size.Width, DepthType.Cv8U, 3));
            _previewBitmapBuffers = new ImageBufferFactory <Android.Graphics.Bitmap>(s => Android.Graphics.Bitmap.CreateBitmap(s.Width, s.Height, Android.Graphics.Bitmap.Config.Rgb565));

            _topLayer = new ProcessedCameraPreview(this, cameraPreviewCallbackWithBuffer);
            _topLayer.PictureTaken += this.PictureTaken;
            _topLayer.ImagePreview += this.ImagePreview;

            _preview = new CameraPreview(this, _topLayer, cameraPreviewCallbackWithBuffer);

            RelativeLayout mainLayout = FindViewById <RelativeLayout>(Resource.Id.CameraPreiewRelativeLayout);

            mainLayout.AddView(_preview, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.MatchParent));
            mainLayout.AddView(_topLayer, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.MatchParent));

#if GL_VIEW
            _topLayer.SetZOrderOnTop(true);
#endif
            RequestedOrientation = Android.Content.PM.ScreenOrientation.Landscape;

            ImageButton switchCameraButton = FindViewById <ImageButton>(Resource.Id.CameraPreviewSwitchCameraImageButton);
            if (Camera.NumberOfCameras <= 1)
            {
                switchCameraButton.Visibility = ViewStates.Invisible;
            }
            else
            {
                switchCameraButton.BringToFront();
            }
            switchCameraButton.Click += delegate
            {
                _preview.SwitchCamera();
            };

            ImageButton captureImageButton = FindViewById <ImageButton>(Resource.Id.CameraPreviewCaptureImageButton);
            captureImageButton.Click += delegate
            {
                Camera camera = _preview.Camera;

                if (camera != null)
                {
                    Camera.Parameters p = camera.GetParameters();
                    p.PictureFormat = Android.Graphics.ImageFormatType.Jpeg;
                    //p.PictureFormat = Android.Graphics.ImageFormatType.Rgb565;
                    camera.SetParameters(p);
                    camera.TakePicture(null, null, _topLayer);
                }
            };

            _lastCapturedImageButton        = FindViewById <ImageButton>(Resource.Id.capturedImageButton);
            _lastCapturedImageButton.Click += delegate
            {
                if (_lastSavedImageFile != null)
                {
                    Intent intent = new Intent(Intent.ActionView, Android.Net.Uri.FromFile(new Java.IO.File(_lastSavedImageFile.FullName)));
                    intent.SetType("image/jpeg");
                    StartActivity(intent);
                }
            };
            _lastCapturedImageButton.BringToFront();

            _previewButtons           = new ImageButton[4];
            _previewFilters           = new ImageFilter[4];
            _previewButtons[0]        = FindViewById <ImageButton>(Resource.Id.previewImageButton);
            _previewFilters[0]        = null;
            _previewButtons[0].Click += delegate
            {
                if (_imageFilter != null)
                {
                    _imageFilter.Dispose();
                    _imageFilter = null;
                }
            };
            _previewButtons[1] = FindViewById <ImageButton>(Resource.Id.cannyImageButton);
            _previewFilters[1] = new CannyFilter(100, 60, 3);

            _previewButtons[2] = FindViewById <ImageButton>(Resource.Id.colorMapImageButton);
            _previewFilters[2] = new ColorMapFilter(Emgu.CV.CvEnum.ColorMapType.Autumn);

            //_previewFilters[3] = new ColorMapFilter(Emgu.CV.CvEnum.ColorMapType.Summer);
            //_previewFilters[3] = null;
            _previewButtons[3] = FindViewById <ImageButton>(Resource.Id.distorImageButton);
            _previewFilters[3] = new DistorFilter(0.5, 0.5, -1.5);

            for (int i = 1; i < _previewButtons.Length; ++i)
            {
                ImageFilter f = _previewFilters[i];
                _previewButtons[i].Click += delegate
                {
                    if (_imageFilter != null)
                    {
                        _imageFilter.Dispose();
                    }
                    _imageFilter = f.Clone() as ImageFilter;
                };
            }
        }
        public void PictureTaken(object sender, ProcessedCameraPreview.PictureTakenEventArgs ea)
        {
            Android.Graphics.Bitmap bmp = ea.Bitmap;
            Camera camera = ea.Camera;

            try
            {
                Android.Graphics.Bitmap thumbnail = null;
                int maxThumbnailSize = 96;
                if (_imageFilter == null)
                {
                    _lastSavedImageFile = ProcessedCameraPreview.SaveBitmap(this, bmp, PackageName, _topLayer);
                    thumbnail           = ProcessedCameraPreview.GetThumbnail(bmp, maxThumbnailSize);
                    bmp.Dispose();
                }
                else
                {
                    Image <Bgr, Byte> buffer1 = new Image <Bgr, byte>(bmp);
                    bmp.Dispose();

                    using (ImageFilter filter = _imageFilter.Clone() as ImageFilter)
                    {
                        if (filter is DistorFilter)
                        {
                            //reduce the image size to half because the distor filter used lots of memory
                            Image <Bgr, Byte> tmp = buffer1.PyrDown();
                            buffer1.Dispose();
                            buffer1 = tmp;
                        }

                        if (filter.InplaceCapable)
                        {
                            filter.ProcessData(buffer1.Mat, buffer1.Mat);
                        }
                        else
                        {
                            Image <Bgr, Byte> buffer2 = new Image <Bgr, byte>(buffer1.Size);
                            filter.ProcessData(buffer1.Mat, buffer2.Mat);
                            buffer1.Dispose();
                            buffer1 = buffer2;
                        }
                    }

                    using (Android.Graphics.Bitmap result = buffer1.ToBitmap())
                    {
                        buffer1.Dispose();
                        _lastSavedImageFile = ProcessedCameraPreview.SaveBitmap(this, result, PackageName, _topLayer);
                        thumbnail           = ProcessedCameraPreview.GetThumbnail(result, maxThumbnailSize);
                    }
                }

                _lastCapturedImageButton.SetImageBitmap(thumbnail);
            }
            catch (Exception excpt)
            {
                this.RunOnUiThread(() =>
                {
                    while (excpt.InnerException != null)
                    {
                        excpt = excpt.InnerException;
                    }
                    AlertDialog.Builder alert = new AlertDialog.Builder(this);
                    alert.SetTitle("Error saving file");
                    alert.SetMessage(excpt.Message);
                    alert.SetPositiveButton("OK", (s, er) => { });
                    alert.Show();
                });
                return;
            }

            /*
             * catch (FileNotFoundException e)
             * {
             * Android.Util.Log.Debug("Emgu.CV", e.Message);
             * }
             * catch (IOException e)
             * {
             * Android.Util.Log.Debug("Emgu.CV", e.Message);
             * } */

            /*
             * try
             * {
             * ExifInterface exif = new ExifInterface(f.FullName);
             * // Read the camera model and location attributes
             * exif.GetAttribute(ExifInterface.TagModel);
             * float[] latLng = new float[2];
             * exif.GetLatLong(latLng);
             * // Set the camera make
             * exif.SetAttribute(ExifInterface.TagMake, "My Phone");
             * exif.SetAttribute(ExifInterface.TagDatetime, System.DateTime.Now.ToString());
             * }
             * catch (IOException e)
             * {
             * Android.Util.Log.Debug("Emgu.CV", e.Message);
             * }*/


            Toast.MakeText(this, "File Saved.", ToastLength.Short).Show();
            camera.StartPreview();
        }