- 我有一个包含数千张包含手的图像的数据集
- 我还有 .mat 文件,其中包含边界框 4 个角的坐标
但是,这些边界框的边缘与 x 和 y 轴成一定角度。例如,
我想使用边界框坐标裁剪出手,然后旋转手使其与 x 或 y 轴对齐。
编辑:
watch 示如下:
但是,请记住矩形不是直的。所以,我必须旋转它来拉直它。
最佳答案
好一个!
第一步:
计算矩形的大小
width = sqrt( sum( (b-a).^2 ) );
height = sqrt( sum( (c-b).^2 ) );
第二步:
计算从 a
...d
到直立图像的仿射变换
Xin = [a(2) b(2) c(2) d(2)];
Yin = [a(1) b(1) c(1) d(1)];
Xout = [width 1 1 width];
Yout = [1 1 height height];
A = [Xin;Yin;ones(1,4)]';
B = [Xout; Yout]';
H = B \ A; % affine transformation
请注意,尽管我们允许 H
是仿射的,但角的选择(取决于 width
和 height
)将确保 H
不会扭曲裁剪后的矩形。
可选择使用 cp2tform
:
H2 = cp2tform( [Xin;Yin]', [Xout;Yout]', 'nonreflectivesimilarity' );
第三步
使用转换得到相关的图像部分
thumb = tformarray( img, maketform( 'affine', H' ), ... %//'
makeresampler( 'cubic', 'fill' ), ...
1:2, 1:2, ceil( [height width] ), [], 0 );
可选择使用 imtransform
:
thumb = imtransform( img, H2, 'bicubic' );
关于向量化的说明:
取决于角点坐标的存储方式 (a
...d
),前两个步骤可以轻松矢量化。
关于matlab - 如何裁剪图像并将其旋转到边界框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17045809/