Бинарная Ориентация Изображения

m пытается найти ориентацию двоичного изображения (где ориентация определена как ось наименьшего момента инерции, то есть наименьшего второго момента площади). Я'использую доктора ХорнаКнига (MIT) о Robot Visionкоторый можно найти здесь как ссылки.

Используя OpenCV, вот моя функция, где a, b и c являются вторыми моментами области, как показано на странице 15 в pdf выше (страница 60 текста):

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 вычисляет вторые моменты вокруг начала координат (0,0), поэтому я должен использоватьТеорема о параллельной оси чтобы переместить ось в центр фигуры, г-н ^ 2.

Центр выглядит правильно, когда я звоню

Point3d p = findCenterAndOrientation(src);
rectangle(src, Point(p.x-1,p.y-1), Point(p.x+1, p.y+1), Scalar(0.25), 1);

Но когда я пытаюсь нарисовать ось с наименьшим моментом инерции, используя эту функцию, она выглядит полностьюнеправильно:

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); 

Вот несколько примеров ввода и вывода:

 

(Я'буду ожидать, что это будет вертикально)

 

(Я'буду ожидать, что он будет горизонтальным)

Ответы на вопрос(1)

Ваш ответ на вопрос