1

我正在关注 youtube 上的 Luca Del Tongo 教程,以便从面部跟踪眼睛。我设法使用矩形来做到这一点,但我想使用 HoughCircle 来跟踪它。 https://www.youtube.com/watch?v=07QAhRJmcKQ

我正在使用以下代码来跟踪我的眼睛,它在我的眼睛周围创建了多个圆圈。在此处输入图像描述 正如他在教程中告诉我们的那样,我只将图像转换为灰度。你能帮忙吗?我是 EMGU CV 的新手

grayFrame.ROI = possibleROI_leftEye;
                MCvAvgComp[][] leftEyesDetected = grayFrame.DetectHaarCascade(_eyes, 1.15, 0, Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size(20, 20));
                grayFrame.ROI = Rectangle.Empty;

                grayFrame.ROI = possibleROI_rightEye;
                MCvAvgComp[][] rightEyesDetected = grayFrame.DetectHaarCascade(_eyes, 1.15, 0, Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size(20, 20));
                grayFrame.ROI = Rectangle.Empty;

                //If we are able to find eyes inside the possible face, it should be a face, maybe we find also a couple of eyes
                if (leftEyesDetected[0].Length != 0 && rightEyesDetected[0].Length != 0)
                {
                    //draw the face
                    frame.Draw(face.rect, new Bgr(Color.Violet), 2);


                    #region Hough Circles Eye Detection

                    grayFrame.ROI = possibleROI_leftEye;
                    CircleF[] leftEyecircles = grayFrame.HoughCircles(new Gray(180), new Gray(70), 5.0, 10.0, 1, 200)[0];
                    grayFrame.ROI = Rectangle.Empty;
                    foreach (CircleF circle in leftEyecircles)
                    {
                        float x = circle.Center.X + startingLeftEyePointOptimized.X;
                        float y = circle.Center.Y + startingLeftEyePointOptimized.Y;
                        frame.Draw(new CircleF(new PointF(x, y), circle.Radius), new Bgr(Color.RoyalBlue), 4);
                    }

                    grayFrame.ROI = possibleROI_rightEye;
                    CircleF[] rightEyecircles = grayFrame.HoughCircles(new Gray(180), new Gray(70), 2.0, 20.0, 1, 5)[0];
                    grayFrame.ROI = Rectangle.Empty;

                    foreach (CircleF circle in rightEyecircles)
                    {
                        float x = circle.Center.X + startingPointSearchEyes.X;
                        float y = circle.Center.Y + startingPointSearchEyes.Y;
                        frame.Draw(new CircleF(new PointF(x, y), circle.Radius), new Bgr(Color.RoyalBlue), 4);
                    }

                    #endregion

现在我把它找到眼睛的部分改成了

 grayImageFrame.ROI = possibleROI_leftEye;
                CircleF[] leftEyecircles = grayImageFrame.HoughCircles(new Gray(180), new Gray(70), 5.0, 10.0, 1, 20)[0];
                if (leftEyecircles.Length > 0)
                {
                    CircleF firstCircle = leftEyecircles[0]; // Pick first circle in list
                    float x = firstCircle.Center.X + startingPointSearchEyes.X;
                    float y = firstCircle.Center.Y + startingPointSearchEyes.Y;
                    ImageFrame.Draw(new CircleF(new PointF(x, y), firstCircle.Radius), new Bgr(Color.RoyalBlue), 4);
                }
                grayImageFrame.ROI = possibleROI_rightEye;
                CircleF[] rightEyecircles = grayImageFrame.HoughCircles(new Gray(180), new Gray(70), 5.0, 10.0, 1, 20)[0];
                grayImageFrame.ROI = Rectangle.Empty;

                if (rightEyecircles.Length > 0)
                {
                    CircleF firstCircle = rightEyecircles[0]; // Pick first circle in list
                    float x = firstCircle.Center.X + startingPointSearchEyes.X;
                    float y = firstCircle.Center.Y + startingPointSearchEyes.Y;
                    ImageFrame.Draw(new CircleF(new PointF(x, y), firstCircle.Radius), new Bgr(Color.RoyalBlue), 4);
                }

只显示一个圆圈,但它跟踪的是我眼睛周围的部分,而不是我的眼睛:(

在此处输入图像描述

4

3 回答 3

0

你得到多个圆圈的原因仅仅是因为你正在用这个for循环绘制所有找到的圆圈

foreach (CircleF circle in rightEyecircles)
{
    float x = circle.Center.X + startingPointSearchEyes.X;
    float y = circle.Center.Y + startingPointSearchEyes.Y;
    frame.Draw(new CircleF(new PointF(x, y), circle.Radius), new Bgr(Color.RoyalBlue), 4);
}

要仅绘制一个圆圈,您必须从列表中选择一个圆圈(或者可能是由多个圆圈形成的复合估计值)并仅绘制该圆圈。

我不是一个真正的 C# 人,但我想这样的事情会起作用

CircleF firstCircle = rightEyecircles[0]; // Pick first circle in list
float x = firstCircle.Center.X + startingPointSearchEyes.X;
float y = firstCircle.Center.Y + startingPointSearchEyes.Y;
frame.Draw(new CircleF(new PointF(x, y), firstCircle.Radius), new Bgr(Color.RoyalBlue), 4);
于 2015-01-30T09:36:47.367 回答
0

与 Hannes 不同,我认为这可以使用图像处理方法来消除您收到的检测数量,而不仅仅是绘制一个找到的圆圈。

  1. 应用高斯模糊以减少噪声并避免错误的圆检测:

    GaussianBlur(src_gray, src_gray, Size(9, 9), 2, 2);

  2. 将最小/最大圆半径应用于霍夫变换

    min_radius = 0:要检测的最小无线电。如果未知,则将零设为默认值。

    max_radius = 0:要检测的最大半径。如果未知,将零作为默认值

于 2015-01-30T09:39:48.123 回答
0

为了检测特定区域中的一只眼球,请执行以下任务

*1- 使用 haarcascade 检测眼睛并选择该眼睛的 ROI 并在那里检测霍夫圆。

2-转换为灰度图像

3-阈值图像*

 grayFrame._ThresholdBinary(new Gray(33), new Gray(255));

4-现在从霍夫圆圈中找到眼球。

快乐编码。

于 2015-10-27T07:46:58.113 回答