【问题标题】:EMGU CV real time Eye tracking using C#EMGU CV 实时眼动追踪使用 C#
【发布时间】:2015-03-29 17:39:45
【问题描述】:

我正在关注 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);
                }

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

【问题讨论】:

  • 问题是什么?
  • 我正在尝试使用 HoughCircle 来检测我的眼睛。但它在我的眼睛周围创造了多个圆圈。 :(我想要有人帮助我,以便在眼睛周围只画一个圆圈

标签: c# opencv emgucv face-detection eye-tracking


【解决方案1】:

你得到多个圆圈的原因仅仅是因为你用这个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);

【讨论】:

  • 圆圈出现在我的眼睛附近,我将更新问题图像。 T
  • 那可能是因为第一个圈子不是最好的圈子。你需要做一些事情来确保你选择的圈子是你真正想要的。
【解决方案2】:

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

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

    高斯模糊(src_gray, src_gray, Size(9, 9), 2, 2);

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

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

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

【讨论】:

  • 公平地说,我回答了问题“为什么我得到多个圈子?”。找到最佳圆是一个困难得多的问题。你的建议听起来不错,所以你的答案可能比我的更有用:)
  • 是的,我想这取决于提问者想要从解决方案中得到什么。你只是打败了我的答案;)
  • 我不知道为什么 Blur 正在关闭我的应用程序
【解决方案3】:

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

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

2-转换成灰度图

3- 阈值图像*

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

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

编码愉快。

【讨论】:

    猜你喜欢
    • 2012-11-30
    • 2018-07-09
    • 2011-05-15
    • 2012-05-19
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    • 2015-12-17
    • 2014-10-20
    相关资源
    最近更新 更多