在 Matlab 中旋转边界框

Rotate a Bounding Box in Matlab

我在图像上绘制了一个边界框:

bbox = [50 20 200 50];
figure; imshow('coins.png'); 
hold on; 
rectangle('Position', bbox, 'EdgeColor','r', 'LineWidth', 3);
hold off;

如何将边界框 bbox 围绕质心 旋转 30 度 然后获取新框的坐标,以便我可以将其与 inpolygon?

更新:请使用定义为 [x y 宽度高度] 的边界框。

要旋转边界框的坐标,您只需定义适当的 rotation matrix

从定义四个角的坐标开始:

X = [bbox(1), bbox(1), bbox(1)+bbox(3), bbox(1)+bbox(3), bbox(1)];
Y = [bbox(2), bbox(2)+bbox(4), bbox(2)+bbox(4), bbox(2), bbox(2)];

旋转总是围绕原点旋转(0,0),如果要围绕盒子中心旋转需要调整旋转前后的XY

Cx = bbox(1)+0.5*bbox(3);
Cy = bbox(2)+0.5*bbox(4);

旋转

Xr = X-Xc; %// subtract center
Yr = Y-Cy;
Xr = cosd(30)*Xr-sind(30)*Yr; %// rotate
Yr = sind(30)*Xr+cosd(30)*Yr;
Xr = Xr+Xc; %// add center back
Yr = Yr+Yc;

现在您可以绘制旋转框

plot( Xr, Yr );

您可以使用 XrYr 作为 xvyv 参数 inpolygon


所有这些代数运算都可以使用 homogeneous coordinates 更优雅地完成,这允许将平移(subtracting/adding 矩形的中心)表示为矩阵乘法。

H = [X;Y;ones(1,5)]; %// points as 3D homogeneous coordinates
Tc = [1 0 -Cx; 0 1 -Cy; 0 0 1]; %// translation as a matrix
Tr = [cosd(30) -sind(30) 0; sind(30) cosd(30) 0; 0 0 1]; %// rotation
Hr = inv(Tc) * Tr * Tc * H; %// all transformations as matrix products

plot( Hr(1,:), Hr(2,:) ); %// the rotated rect