翻译 unsigned int n = points.size(); if (n < 2) { return; } RNG random; double bestScore = -1.; vector<Point2d>vpdTemp; int iterations = log(1 - 0.99) / (log(1 - (1.00 / n)))*10; for (int k = 0; k < iterations; k++) { int i1 = 0, i2 = 0; while (i1 == i2) { i1 = random(n); i2 = random(n); } const cv::Point2d& p1 = points[i1]; const cv::Point2d& p2 = points[i2]; Point2d vectorP21 = p2 - p1; vectorP21 *= 1. / norm(vectorP21); double score = 0; vpdTemp.clear(); for (int i = 0; i < n; i++) { Point2d vectorPi1 = points[i] - p1; double d = vectorPi1.y * vectorP21.x - vectorPi1.x * vectorP21.y;//calculate the cosΘ of the two vectors. if (fabs(d) < sigma) { score += 1; } else { vpdTemp.push_back(points[i]); } } if (score > bestScore) { bestScore = score; vpdExceptPoints = vpdTemp; } }
时间: 2024-03-15 22:42:08 浏览: 179
eeprom.rar_EEPROM int_Unsigned_intrins.h_site:www.pudn.com_换头文件e
这段代码的作用是利用随机采样一致性算法(RANSAC)来估算一组二维点集中的直线。首先,通过points.size()获取点集中点的数量,并将其赋值给无符号整型变量n。如果n小于2,直接返回。接着使用RNG类生成一个伪随机数对象random。然后定义一个变量bestScore表示最好的得分,初始值为-1.0。定义一个vpdTemp向量用于存储临时点集,和一个iterations变量表示迭代次数,计算公式为log(1 - 0.99) / (log(1 - (1.00 / n))) * 10。在循环中,执行iterations次随机采样。每次采样随机选取两个点,计算它们连成的直线的得分,如果得分比目前最好的得分要高,则更新最好的得分和vpdExceptPoints向量。最后返回vpdExceptPoints向量,它包含了剔除异常点后的点集。
阅读全文