Orientación de la imagen binaria

Estoy tratando de encontrar la orientación de una imagen binaria (donde la orientación se define como el eje del menor momento de inercia, es decir, el segundo segundo del área). Estoy usando el libro del Dr. Horn (MIT) en Robot Visionque se puede encontrar aquí como referencia.

Usando OpenCV, aquí está mi función, donde a, b y c son los segundos momentos del área tal como se encuentran en la página 15 del pdf anterior (página 60 del texto):

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 calcula los segundos momentos alrededor del origen (0,0), así que tengo que usar elTeorema del eje paralelo para mover el eje al centro de la forma, mr ^ 2.

El centro se ve bien cuando llamo.

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

Pero cuando trato de dibujar el eje con el momento de inercia más bajo, usando esta función, se ve completamenteincorrecto:

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

Aquí hay algunos ejemplos de entrada y salida:

(Espero que sea vertical)

(Espero que sea horizontal)

Respuestas a la pregunta(1)

Su respuesta a la pregunta