我试图找到二进制图像的方向(其中方向被定义为最小惯性矩的轴,即最小第二面积矩)。我正在使用霍恩博士的关于机器人视觉的书 (MIT) ,可以在此处找到作为参考。
使用 OpenCV,这是我的函数,其中 a、b 和 c 是上述 pdf 第 15 页(正文第 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) 的第二个矩,因此我必须使用平行轴定理将轴移动到形状的中心,mr^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);
以下是输入和输出的一些示例:
(我希望它是垂直的)
(我希望它是水平的)