Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于C语言的EMGU-CV实时眼球跟踪_C#_Opencv_Emgucv_Face Detection_Eye Tracking - Fatal编程技术网

C# 基于C语言的EMGU-CV实时眼球跟踪

C# 基于C语言的EMGU-CV实时眼球跟踪,c#,opencv,emgucv,face-detection,eye-tracking,C#,Opencv,Emgucv,Face Detection,Eye Tracking,我正在youtube上关注Luca Del Tongo教程,以便从面部追踪眼睛。我设法用矩形来实现,但我想用HoughCircle来跟踪它。 我正在使用以下代码跟踪我的眼睛,它正在我的眼睛周围创建多个圆圈。 我只是按照他在教程中告诉我们的那样将图像转换为灰度。你能帮忙吗?我是EMGU CV的新手 grayFrame.ROI = possibleROI_leftEye; MCvAvgComp[][] leftEyesDetected = grayFrame.Det

我正在youtube上关注Luca Del Tongo教程,以便从面部追踪眼睛。我设法用矩形来实现,但我想用HoughCircle来跟踪它。

我正在使用以下代码跟踪我的眼睛,它正在我的眼睛周围创建多个圆圈。 我只是按照他在教程中告诉我们的那样将图像转换为灰度。你能帮忙吗?我是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);
                }
只显示了一个圆圈,但它跟踪的是我眼睛周围的部分,而不是我的眼睛:


获得多个圆的原因很简单,因为您正在使用此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);

与Hannes不同,我认为这可以通过使用图像处理方法来消除你收到的检测数量,而不仅仅是画一个发现的圆圈

应用高斯模糊以减少噪声并避免假圆检测:

GaussianBlur src_gray,src_gray,尺寸9,9,2,2

将最小/最大圆半径应用于Hough变换

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

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


要检测特定区域中的一个眼球,请执行以下任务

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

2-转换为灰度图像

3-对图像设置阈值*

 grayFrame._ThresholdBinary(new Gray(33), new Gray(255));
4-现在从hough圆中找到眼球


快乐编码。

问题是什么?我正在尝试使用HoughCircle来检测我的眼睛。但它在我的眼睛周围形成了多个圆圈我希望有人能帮助我,以便在眼睛周围只画一个圆圈。公平地说,我回答了为什么我会画多个圆圈的问题?。寻找最佳圆是一个困难得多的问题。不过,你的建议听起来不错,所以你的答案可能比我的更有用:是的,我想这取决于提问者想从解决方案中得到什么。你只是抢先给了我一个答案;我不知道为什么模糊正在关闭我的应用程序圆圈出现在我的眼睛附近我将更新问题图像。这可能是因为第一个圆不是最好的圆。你需要做点什么来确保你选择的圆圈是你真正想要的。