Подтвердить что ты не робот

Алгоритм подстройки OpenCV

Я пытаюсь понять алгоритм OpenCV fitLine().

Это фрагмент кода из OpenCV: icvFitLine2D функция - icvFitLine2D

Я вижу, что есть некоторая случайная функция, которая выбирает точки для аппроксимации, затем вычисляет расстояния от точек до установленной линии (с выбранными точками), затем выбирает другие точки и пытается минимизировать расстояние с выбранным distType.

Может ли кто-нибудь уточнить, что происходит из в этот момент без жесткой математики и не допуская больших статистических знаний?. Комментарии кодов OpenCV и имена переменных не помогают мне в понимании этого кода.

4b9b3361

Ответ 1

(Это старый вопрос, но тема вызвала мое любопытство)

OpenCV FitLine реализует два разных механизма.

Если для параметра distType установлено значение CV_DIST_L2, то используется стандартный невзвешенный наименьший квадрат.

Если используется один из других distTypes (CV_DIST_L1, CV_DIST_L12, CV_DIST_FAIR, CV_DIST_WELSCH, CV_DIST_HUBER), то процедура является своего рода RANSAC fit:

  • Повторите не более 20 раз:
    • Выберите 10 случайных точек, сделайте квадраты наименьших квадратов только для них.
    • Повторите не более 30 раз:
  • Возврат наилучшего найденного линейного текста

Вот более подробное описание в псевдокоде:

repeat at most 20 times:

    RANSAC (line 371)
     - pick 10 random points, 
     - set their weights to 1, 
     - set all other weights to 0

    least squares weighted fit (fitLine2D_wods, line 381)
     - fit only the 10 picked points to the line, using least-squares

    repeat at most 30 times: (line 382)
     - stop if the difference between the found solution and the previous found solution is less than DELTA  (line 390 - 406)
       (the angle difference must be less than adelta, and the distance beween the line centers must be less than rdelta)
     - stop if the sum of squared distances between the found line and the points is less than EPSILON (line 407)
       (The unweighted sum of squared distances is used here ==> the standard L2 norm)

        re-calculate the weights for *all* points (line 412)
         - using the given norm (CV_DIST_L1 / CV_DIST_L12 / CV_DIST_FAIR / ...)
         - normalize the weights so their sum is 1
         - special case, to catch errors: if for some reason all weights are zero, set all weight to 1

        least squares weighted fit (fitLine2D_wods, line 437)
         - fit *all* points to the line, using weighted least squares

    if the last found solution is better than the current best solution (line 440)
        save it as the new best
        (The unweighted sum of squared distances is used here ==> the standard L2 norm)

        if the distance between the found line and the points is less than EPSILON
             break

return the best solution

Весы рассчитываются в зависимости от выбранного distType, согласно руководству формула для этого weight[Point_i] = 1/ p(distance_between_point_i_and_line), где p является:

distType = CV_DIST_L1 enter image description here

distType = CV_DIST_L12 enter image description here

distType = CV_DIST_FAIR enter image description here

distType = CV_DIST_WELSCH enter image description here

distType = CV_DIST_HUBER enter image description here

К сожалению, я не знаю, какой distType лучше всего подходит для каких-либо данных, возможно, некоторые другие могут пролить свет на это.


Что-то интересное я заметил: выбранная норма используется только для повторного взвешивания, наилучшее решение среди найденных всегда выбирается в соответствии с нормой L2 (линия, для которой невзвешенная сумма наименьших квадратов минимальна). Я не уверен, что это правильно.