Я использую метод решения 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 :: решить, чтобы соответствовать кривой.
Проблема, с которой я сталкиваюсь, состоит в том, что набор из точек не обязательно следовать математической функции (например, функция меняет свое уравнение, см. рисунок). Итак, чтобы соответствовать точной кривой, мне нужно разделить множество точек, где изменяется кривизна. В случае рисунка ниже я бы разделил регрессию по индексу, с которого начинается кривая. Поэтому мне нужно определить, где изменяется кривизна.
Итак, если я не разделю, в результате я получу желтую кривую, которая является неточной. Мне нужна синяя кривая.
Поиск изменений кривизны: чтобы узнать, где меняется кривизна, я хочу использовать решение точность . Итак, в основном:
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 мс) осталось времени))
- это хороший способ найти изменение кривизны / кто-нибудь знает лучший способ?
Спасибо :))