void ShowDetectedRect()
        {
            labelStatus.Text       = "";
            labelDetectedRect.Text = "";
            labelRectInfo.Text     = "";
            listBoxDetectedRect.Items.Clear();

            if (_ImgCol != null &&
                listBoxImg.SelectedIndex >= 0 &&
                listBoxImg.SelectedIndex < _ImgCol.ImgList.Count &&
                checkBoxDetect.Checked
                )
            {
                LabeledImg labeledImg = _ImgCol.ImgList[listBoxImg.SelectedIndex];

                if (labeledImg != null)
                {
                    List <ScoredRect> ascoredRect = null;
                    DetectionResult   detRes      = DetectFaces(labeledImg);

                    if (detRes != null)
                    {
                        float eThreshold = trackBarThreshold.Value * _eStepSize;

                        if (radioButtonMergedRect.Checked)
                        {
                            ascoredRect = detRes.GetMergedRectList(eThreshold);
                        }
                        else
                        {
                            ascoredRect = detRes.GetRawRectList(eThreshold);
                        }
                    }

                    if (ascoredRect != null)
                    {
                        listBoxDetectedRect.SuspendLayout();

                        listBoxDetectedRect.Items.Clear();

                        labelDetectedRect.Text = ascoredRect.Count + " rectangle(s)";

                        foreach (ScoredRect rect in ascoredRect)
                        {
                            listBoxDetectedRect.Items.Add(rect);
                        }

                        listBoxDetectedRect.ResumeLayout();
                    }
                }
            }
        }
        private void ImgListBoxDrawItem(object sender, DrawItemEventArgs e)
        {
            if (e != null && _ImgCol != null && e.Index >= 0 && e.Index < _ImgCol.ImgList.Count)
            {
                LabeledImg labeledImg = _ImgCol.ImgList[e.Index];

                Bitmap img = new Bitmap(labeledImg.FileName);

                Rectangle rectDraw = e.Bounds;

                // offset
                rectDraw.Inflate(-1, 0);

                // draw a boundary if selected
                if ((e.State & DrawItemState.Selected) != 0)
                {
                    e.Graphics.DrawRectangle(new Pen(Color.Blue), rectDraw);
                }
                else
                {
                    e.Graphics.DrawRectangle(new Pen(Color.White), rectDraw);
                }

                // offset
                rectDraw.Offset(5, 5);
                rectDraw.Inflate(-10, -10);

                Rectangle rect = rectDraw;

                if ((img.Width * rectDraw.Height) > (img.Height * rectDraw.Width))
                {
                    rect.Width  = rectDraw.Width;
                    rect.Height = ((img.Height * rectDraw.Width) / img.Width);
                }
                else
                {
                    rect.Height = rectDraw.Height;
                    rect.Width  = ((img.Width * rectDraw.Height) / img.Height);
                }

                rect.X += (rectDraw.Width - rect.Width) / 2;
                rect.Y += (rectDraw.Height - rect.Height) / 2;

                e.Graphics.DrawImage(img, rect);

                e.Graphics.DrawString((e.Index + 1).ToString(),
                                      new Font("Arial", 14),
                                      new SolidBrush(Color.Maroon),
                                      new PointF(rectDraw.X + 5, rectDraw.Y + 5));
            }
        }
        DetectionResult DetectFaces(LabeledImg labeledImg)
        {
            DetectionResult detRes = null;

            if (checkBoxDetect.Checked)
            {
                try
                {
                    labelStatus.Text = "Detecting...";
                    Application.DoEvents();

                    Cursor = Cursors.WaitCursor;

                    detRes = labeledImg.GetDetectionResult(_faceDetect);

                    if (detRes != null)
                    {
                        labelStatus.Text = "Detection Time: " + detRes.tmDetection.Ticks / 10000 + " msec";
                    }
                    else
                    {
                        labelStatus.Text = "Failed!";
                    }

                    Cursor = Cursors.Default;
                }
                catch (Exception ex)
                {
                    Cursor = Cursors.Default;

                    MessageBox.Show(ex.Message);

                    return(null);
                }
            }

            return(detRes);
        }
        void RenderImage(Graphics graf)
        {
            if (_ImgCol == null ||
                listBoxImg.SelectedIndex < 0 ||
                listBoxImg.SelectedIndex >= _ImgCol.ImgList.Count
                )
            {
                _fImgDirty           =
                    _fDetectionDirty = false;

                return;
            }

            LabeledImg labeledImg = _ImgCol.ImgList[listBoxImg.SelectedIndex];

            // render the image
            if (_fImgDirty)
            {
                labelImgName.Text = labeledImg.FileName;

                Rectangle rect = labelImageBorder.Bounds;
                rect.Width  = labelHeader.Left - 1 - labelImageBorder.Bounds.Left;
                rect.Height = labelStatus.Top - 1 - labelImageBorder.Bounds.Top;

                graf.FillRectangle(new SolidBrush(BackColor), rect);

                labeledImg.Render(graf, labelImageBorder.Bounds);

                if (checkBoxLabel.Checked)
                {
                    labeledImg.RenderAnnotations(graf, labelImageBorder.Bounds);
                }

                _fImgDirty = false;
            }

            if (_fDetectionDirty)
            {
                if (checkBoxDetect.Checked)
                {
                    DetectionResult detRes = DetectFaces(labeledImg);

                    if (detRes != null)
                    {
                        float eThreshold = trackBarThreshold.Value * _eStepSize;

                        if (radioButtonRawRectangles.Checked)
                        {
                            detRes.RenderRawRect(eThreshold, graf, labelImageBorder.Bounds);
                        }

                        if (radioButtonMergedRect.Checked)
                        {
                            detRes.RenderMergedRect(eThreshold, graf, labelImageBorder.Bounds);
                        }
                    }

                    if (listBoxDetectedRect.Items.Count > 0)
                    {
                        ScoredRect scoredRect = (ScoredRect)listBoxDetectedRect.SelectedItem;

                        if (scoredRect != null)
                        {
                            labelRectInfo.Text = "Rect #" + listBoxDetectedRect.SelectedIndex + "\r\n" +
                                                 scoredRect.ToString() + "\r\n" +
                                                 "Score: " + scoredRect.Score;

                            scoredRect.Render(graf, labelImageBorder.Bounds, true);

                            labeledImg.Render(graf, scoredRect.Bounds, labelFaceBorder.Bounds);
                            labeledImg.Render(graf, scoredRect.Bounds, labelFaceBorderBig.Bounds);
                        }
                    }
                }

                _fDetectionDirty = false;
            }
        }