sylvain231 a écrit:calculer les écarts avec la parabole théorique des points de départ avec les points de la parabole et en faire la somme
La distance entre un point (x, y) et une parabole peut être déterminée en calculant la distance perpendiculaire entre le point et la courbe de la parabole. La formule générale pour la distance entre un point et une courbe est donnée par :
Distance = |ax + by + c| / √(a^2 + b^2)
Dans notre cas, l'équation de la parabole est donnée par :
0 = a * (θ * (x - sommet.x) + sin(θ) * (y - sommet.y))^2 - sin(θ) * (x - sommet.x) - cos(θ) * (y - sommet.y)
sylvain231 a écrit:calculer les écarts avec la parabole théorique des points de départ avec les points de la parabole et en faire la somme
prendre le a et le theta correspondant au minimum de cette somme
void Parabole::fit(std::vector<cv::Point2d> points, cv::Point2d sommet) {
this->sommet = sommet;
int n = points.size();
cout << "sommet = " << sommet << endl;
points = translatePoint2ds(points, sommet);
double minimum = std::numeric_limits<double>::infinity();
for (int s = -1; s <=1; s += 2) {
for (double logA = -5; logA <= 5; logA += 0.1) {
//cout << "logA=" << logA << endl;
a = s*exp(logA);
cout << "a=" << a << endl;
for (double theta = 0; theta <= CV_PI; theta += CV_PI / 1000) {
double cos_ = cos(theta);
double sin_ = sin(theta);
vector<double> R;
for (int i = 0; i < n; i++) {
R.push_back(a * (points[i].x * cos_ + points[i].y * sin_));
}
double S = 0;
for (int i = 0; i < n; i++) {
S += pow(pow(R[i], 2) * sin_ / a + R[i] * cos_ / a - points[i].x, 2) + pow(pow(R[i], 2) * cos_ / a - R[i] * sin_ / a - points[i].y, 2);
}
if (S < minimum) {
minimum = S;
this->a = a;
this->theta_radians = theta;
}
}
}
}
this->theta = 180 * theta_radians / CV_PI;
}
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 49 invités
Tu pars déja ?
Identification
Pas encore inscrit ?
Ou identifiez-vous :