У меня есть этот код в моей программе:
findContours(canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );
for(int i = 0; i < contours.size(); i++){
if(hierarchy[i][3] >=0 && arcLength(contours[i], true) > 240){
Moments mu = moments(contours[i], false);
Point2d mc(mu.m10/mu.m00, mu.m01/mu.m00);
double m11 = mu.m11 / mu.m00;
double m20 = mu.m20 / mu.m00;
double m02 = mu.m02 / mu.m00;
double orientation = 0.5*atan(2*m11 / (m20 - m02));
double lambda1 = (m20 + m02)/2 + sqrt(4*m11*m11 - (m20 - m02)*(m20 - m02));
double lambda2 = (m20 + m02)/2 - sqrt(4*m11*m11 - (m20 - m02)*(m20 - m02));
cout << "labmda1: " << lambda1 << endl << "labmda2: " << lambda2 << endl;
cout << "orientation: " << orientation << endl << "mc: " << mc << endl << endl;
//ellipse(drawing_ellipses, mc, Size(lambda2, lambda1), orientation, 0, 360, Scalar(0, 0, 255), 1);
}
}
Если я правильно понимаю, лямбда1 и лямбда2 должны быть полуоси большой и полуосновной осей эллипса, mc — его центр, а ориентация — угол поворота. Вместо этого только mc вычисляет правильно, другие параметры неверны (лямбда намного больше, чем должна быть), даже если контур является эллипсом. Как я могу это исправить?
Могу я спросить, для чего это? Я делаю подобное исследование в попытке сделать фидуциальный маркер.
Проблема моего исследования заключается в том, что:
lambda1 = (m20 + m02) / 2 + sqrt (4 * m11 * m11 — (m20 — m02) * (m20 — m02));
на самом деле должно быть:
lambda1 = srqt ((m20 + m02) / 2 + sqrt (4 * m11 * m11 — (m20 — m02) * (m20 — m02)));
Надеюсь это поможет 🙂