我試圖找到二進制圖像的方向(其中方向定義爲最小慣性矩的軸,即最小面積的二次矩)。作爲參考,我正在使用Dr.Horn的書(MIT)作爲機器人視覺which can be found here。Binary Image Orientation
使用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),因此我必須使用Parallel Axis Theorem將軸移動到形狀的中心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);
以下是一些輸入和輸出示例:
(我希望它是垂直)
(我希望它是水平)
a,b和c以及θ的值是多少?你能打印出來並說服自己是對的嗎?當你將對象居中時會發生什麼?這有幫助嗎?這些將是兩個調試步驟開始...... – Floris
對於一個起點,你應該像'm20/m00'一樣進行分割,而不是減去。 – mmgp
a,b,c等m.m00部分正在使用平行軸定理將旋轉點從圖像原點移動到對象原點。 – Jason