我正在使用的图片链接在上面。我正在使用OpenCV和C#。我有一个运行在30FPS的视频,我正在尝试使用霍夫算法找到圆圈(视频中不同级别的光线意味着我必须动态调整参数)。图为我遇到的问题。根据相机的移动方式,算法可能会标记没有相机的圆圈。
我想要做的是使用程序生成的每个圆的中心点位置(列表如下)找到并忽略这些假圈作为异常值。基本上,如果圆的可能性很低,我宁愿不显示圆。我正在考虑编写一个函数,该函数使用每个圆的位置的人口标准差(圆圈在视频中相对均匀的距离),并忽略在该帧中超过两个或三个标准差的圆。/ p>
我最大的限制是需要为每个帧运行这个计算,所以我需要尽可能高效地进行计算(后台发生的一些事情也在消耗CPU周期)。我在Stack Overflow上找到了一个函数来计算标准差,看起来它可能有用,但它只适用于单个值。我需要弄清楚如何将它应用于坐标或只是想出另一种解决问题的方法。这是代码和点列表:
public static double StandardDeviation(this IEnumerable<double> values)
{
double avg = values.Average();
return Math.Sqrt(values.Average(v=>Math.Pow(v-avg,2)));
}
列表pointList = new List(){new PointF(122.5F,157.5F), 新的PointF(77.5F,232.5F), 新的PointF(167.5F,237.5F), 新的PointF(42.5F,152.5F), 新的PointF(172.5F,82.5F), 新的PointF(212.5F,162.5F), 新PointF(257.5F,242.5F), 新的PointF(122.5F,307.5F), 新的PointF(87.5F,82.5F), 新的PointF(32.5F,302.5F), 新的PointF(207.5F,317.5F), 新的PointF(347.5F,247.5F), 新的PointF(442.5F,97.5F), 新的PointF(402.5F,17.5F), 新的PointF(137.5F,7.5F), 新的PointF(312.5F,167.5F), 新PointF(297.5F,322.5F), 新的PointF(397.5F,172.5F), 新的PointF(437.5F,247.5F), 新PointF(387.5F,322.5F), 新的PointF(352.5F,87.5F), 新的PointF(312.5F,7.5F), 新PointF(272.5F,82.5F), 新的PointF(222.5F,7.5F), 新的PointF(77.5F,372.5F), 新的PointF(477.5F,322.5F)};
答案 0 :(得分:-1)
您想要围绕圆圈中心的root mean square distance。来自OpenCV QA论坛的This answer有一个简单的解决方案:
同时使用
x
和y
坐标,循环点并使用以下公式:
MEAN_X += pow(x - x0, 2);
MEAN_Y += pow(y - y0, 2);
TOTAL_RMS = sqrt( 1/n * (MEAN_X + MEAN_Y));
x , y
:来自image2的坐标x0 , y0
:来自image1的坐标n
:积分数