在 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)
,如果要围绕盒子中心旋转需要调整旋转前后的X
和Y
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 );
您可以使用 Xr
和 Yr
作为 xv
和 yv
参数 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
我在图像上绘制了一个边界框:
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)
,如果要围绕盒子中心旋转需要调整旋转前后的X
和Y
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 );
您可以使用 Xr
和 Yr
作为 xv
和 yv
参数 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