sylvain231 a écrit:a= 1.91461 b= 2.14439 c= 2.87474 t=0.728849
tu n'as pas dû voir mon message quand je disais que j'avais oublié de mettre le sommet en (0,0)
sylvain231 a écrit:désolé je n'avais pas mis le sommet en (0,0) voici mes résultats :
a= 1.91461 b= 2.14439 c= 2.87474 t=0.728849
sylvain231 a écrit:ça me dérange de prendre r car ça parcourt tous les réels et ils sont beaucoup trop nombreux, en plus je ne peux pas avoir de x et de y négatif dans une image, je préfère tracer en prenant tous les x de 0 à nombre de pixels horizontaux et les y de 0 à nombre de pixels verticaux
sylvain231 a écrit:il vaudrait mieux reprendre un exemple avec le sommet en (200,200)
void Parabole::draw (Mat& img, cv::Vec3b color){
// Itérer sur chaque pixel
for(double y = 0; y < img.rows; y+=0.1) {
for(double x = 0; x < img.cols; x += 0.1) {
// Calculer X' et Y'
double X_prime = x - sommet.x;
double Y_prime = y - sommet.y;
// Calculer la valeur de l'équation de la parabole
double val;
val = pow(b*X_prime-a*X_prime,2)/(pow(a,2)+pow(b,2))-(a*X_prime+b*Y_prime);
//cout << "val" << val << endl;
// Si val est proche de 0, colorer le pixel
if(fabs(val) < 0.5) { // Vous pouvez ajuster la tolérance
img.at<cv::Vec3b>(y, x) = color; // Par exemple, en blanc
}
}
}
}
void Parabole::fit2(std::vector<cv::Point2d> points, cv::Point2d sommet) {
this->sommet = sommet;
int n = points.size();
cout << "sommet = " << sommet << endl;
points = translatePoint2ds(points, sommet);
double bestTheta = 0;
double minimum = std::numeric_limits<double>::infinity();
for (double theta = 0; theta <= CV_PI; theta += CV_PI / 1000) {
vector<Point2d> rotated = rotatePoint2ds(points, theta);
double E1 = 0;
for (int i = 0; i < n; i++) {
E1 += pow(rotated[i].y, 2);
}
double E2 = 0;
for (int i = 0; i < n; i++) {
E2 += pow(rotated[i].x, 2) * rotated[i].y;
}
double E3 = 0;
for (int i = 0; i < n; i++) {
E3 += pow(rotated[i].x, 4);
}
double delta = E1 - (pow(E2, 2) / E3);
if (delta < minimum) {
minimum = delta;
bestTheta = theta;
}
}
this->theta_radians = bestTheta;
this->theta = bestTheta * 180 / CV_PI;
vector<Point2d> rotated = rotatePoint2ds(points, bestTheta);
double E2 = 0;
for (int i = 0; i < n; i++) {
E2 += pow(rotated[i].x, 2) * rotated[i].y;
}
double E3 = 0;
for (int i = 0; i < n; i++) {
E3 += pow(rotated[i].x, 4);
}
this->a = E2 / E3;
this->aa = sin(theta_radians) / (4 * a);
this->b = cos(theta_radians) / (4 * a);
cout << "aa" << aa << "b" << b << endl;
cout << "a=" << this->a << endl;
}
void Parabole::fit2(std::vector<cv::Point2d> points, cv::Point2d sommet) {
this->sommet = sommet;
int n = points.size();
cout << "sommet = " << sommet << endl;
points = translatePoint2ds(points, sommet);
double bestTheta = 0;
double minimum = std::numeric_limits<double>::infinity();
for (double theta = 0; theta <= CV_PI; theta += CV_PI / 1000) {
vector<Point2d> rotated = rotatePoint2ds(points, theta);
double E1 = 0;
for (int i = 0; i < n; i++) {
E1 += pow(rotated[i].y, 2);
}
double E2 = 0;
for (int i = 0; i < n; i++) {
E2 += pow(rotated[i].x, 2) * rotated[i].y;
}
double E3 = 0;
for (int i = 0; i < n; i++) {
E3 += pow(rotated[i].x, 4);
}
double delta = E1 - (pow(E2,2) / E3);
if (delta < minimum) {
minimum = delta;
bestTheta = theta;
}
}
this->theta_radians = bestTheta;
this->theta = bestTheta * 180 / CV_PI;
vector<Point2d> rotated = rotatePoint2ds(points, bestTheta);
double E2 = 0;
for (int i = 0; i < n; i++) {
E2 += pow(rotated[i].x, 2) * rotated[i].y;
}
double E3 = 0;
for (int i = 0; i < n; i++) {
E3 += pow(rotated[i].x, 4);
}
this->a = E2 / E3;
this->aa = sin(theta_radians) / (4 * a);
this->b = cos(theta_radians) / (4 * a);
cout << "aa" << aa << "b" << b << endl;
cout << "a=" << this->a << endl;
}
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 33 invités
Tu pars déja ?
Identification
Pas encore inscrit ?
Ou identifiez-vous :