Próbuję znaleźć orientację obrazu binarnego (gdzie orientacja jest zdefiniowana jako oś najmniejszego momentu bezwładności, tj. Najmniejszy drugi moment obszaru). Używam książki dr Horn'a (MIT) w Robot Vision which can be found here jako odnośniku.Orientacja obrazu binarnego
Używanie OpenCV, tu jest moja funkcja, gdzie a, b, c są drugie momenty obszarze, jak znaleźć na stronie 15 pdf powyżej (strona 60 tekstu):
Point3d findCenterAndOrientation(const Mat& src)
{
Moments m = cv::moments(src, true);
double cen_x = m.m10/m.m00; //Centers are right
double cen_y = m.m01/m.m00;
double a = m.m20-m.m00*cen_x*cen_x;
double b = 2*m.m11-m.m00*(cen_x*cen_x+cen_y*cen_y);
double c = m.m02-m.m00*cen_y*cen_y;
double theta = a==c?0:atan2(b, a-c)/2.0;
return Point3d(cen_x, cen_y, theta);
}
OpenCV oblicza sekundy wokół początku (0,0), więc muszę użyć Parallel Axis Theorem, aby przesunąć oś do środka kształtu, mr^2.
Centrum wygląda dobrze, gdy zadzwonię
Point3d p = findCenterAndOrientation(src);
rectangle(src, Point(p.x-1,p.y-1), Point(p.x+1, p.y+1), Scalar(0.25), 1);
Ale gdy próbuję narysować oś z najniższego momentu bezwładności, przy użyciu tej funkcji, wygląda zupełnie złym:
line(src, (Point(p.x,p.y)-Point(100*cos(p.z), 100*sin(p.z))), (Point(p.x, p.y)+Point(100*cos(p.z), 100*sin(p.z))), Scalar(0.5), 1);
Oto kilka przykładów wejścia i wyjścia:
(będę oczekiwać, że będzie w pionie)
(będę oczekiwać, że będzie pozioma)
Jakie są wartości a, b i c - oraz theta? Czy możesz je wydrukować i przekonać się, że mają rację? Co się dzieje, gdy wyśrodkujesz obiekt? To pomaga? Aby rozpocząć, byłyby to dwa etapy debugowania ... – Floris
Aby zacząć, należy dzielić jak "m20/m00", a nie odejmować. – mmgp
Część m.m00 na a, b, c itd. Używa twierdzenia o osi równoległej, aby przesunąć punkt obrotu od początku obrazu do początku obiektu. – Jason