Точность решения OpenCV методом наименьших квадратов - PullRequest
0 голосов
/ 22 января 2020

Я использую метод решения OpenCV (https://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html#solve) в C ++, чтобы подогнать кривую (класс 3, топор ^ 3 + bx ^ 2 + cx + d) через набор точек. Я решаю A * x = B, A содержит степени x-координат точек (то есть x ^ 3, x ^ 2, x ^ 1, 1), а B содержит координаты y точек, x (Matrix) содержит параметры a, b, c и d.

Я использую флаг DECOMP_QR на cv :: решить, чтобы соответствовать кривой.

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

Итак, если я не разделю, в результате я получу желтую кривую, которая является неточной. Мне нужна синяя кривая.

linear regression inaccuracy

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

int splitIndex = 0;

for(int pointIndex = 0; pointIndex < numberOfPoints; pointIndex += 5) {
      cv::Range rowR = Range(0, pointIndex);         //Selected rows to index
      cv::Range colR = Range(0,3);               //Grade: 3 (x^3)
      cv::Mat x;
      bool res = cv::solve(A(rowR, colR), B(rowR, Range(0,1)),x , DECOMP_QR);
      if(res == true) {
                //Check for accuracy
                if (accuracy too bad) {
                          splitIndex = pointIndex;
                          return splitIndex;
                }
      }
}

Мои вопросы:
- есть ли способ получить точность / стандартное отклонение от команды решения (эффективно и быстро, из-за применения в реальном времени (вычисление около 1 мс) осталось времени))
- это хороший способ найти изменение кривизны / кто-нибудь знает лучший способ?

Спасибо :))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...