McM*_*cMa 5 math matlab opencv image-processing affinetransform
我在图像中检测到一个显着区域,我执行了一系列操作,最重要的是仿射归一化(将椭圆转换为圆形,将梯形转换为等边矩形).
仿射归一化是矩阵中剪切和缩放的组合,如下所示:
Chol=[a,b
0,c]
Run Code Online (Sandbox Code Playgroud)
a,[0,1]中的c和[-1,1]中的b(对于那些感兴趣的人,它是检测到的区域的协方差矩阵的Cholesky分解的逆矩阵).
一切正常,直到这里,但是当我将变换应用到原始帧时
AffineFrame=cv.warpAffine(RealFrame,[Chol,[0;0]],...
'DSize',[RealFrameSize(1),RealFrameSize(2)]);
% that's dst=cv.warpAffine(src,trafo) with trafo: 2x3 Matrix (here Chol and [0,0] translation)
Run Code Online (Sandbox Code Playgroud)
我得到一个未缩放的图像,转换和图像大小: .
我真正想要的是 - 并且通过这条线的试错来实现这个特定的框架
AffineFrame=cv.warpAffine(RealFrame,[Chol,[0;0]]*S,...
'DSize',[RealFrameSize(1)*X,RealFrameSize(2)*Y]);
Run Code Online (Sandbox Code Playgroud)
看起来像这样:
.
我知道问题在于缩放S
,X
和Y
.如果有人知道如何计算这个,你将节省我回到学校几何的漫长旅程!(我已经拥有了可以从第二个图像时刻中提取的所有几何信息,如市长和短轴,各自的幅度,偏心率等等.)
编辑:一些典型值(不一定是这种情况):
Chol = 0.43 -0.23
0 0.67
Run Code Online (Sandbox Code Playgroud)
这个想法我有X
和Y
:与L
和W
主轴线和次轴线的大小(变化很大,这取决于形状通常约5和50):
X=(1+L/(L+W));
Y=(1+W/(L+W));
Run Code Online (Sandbox Code Playgroud)
仅当剪切Chol
不大时才有效.S
取决于形状,在5到30之间做得很好.
恐怕没有办法绕过一些简单的数学(这也不是那么困难......)!
从我们的变换矩阵
Chol=L1 L2
0 L3
Run Code Online (Sandbox Code Playgroud)
Chol=Sc*Sh*Rot
是缩放、剪切和旋转的枚举
Sc=Sx 0 , Sh=1 m , Rot= cos(alpha) sin(alpha)
0 Sy 0 1 -sin(alpha) cos(alpha)
Run Code Online (Sandbox Code Playgroud)
如下alpha=0
:
L1=Sx , L2=m*Sx , L3=Sy , m=L1/L2.
Run Code Online (Sandbox Code Playgroud)
要重新缩放变换,请使用最高缩放因子的倒数Sy or Sx
:
%MatLab
CholScale=Chol*[1/max(Chol(1,1),Chol(2,2)),0;0,1/max(Chol(1,1),Chol(2,2))];
Run Code Online (Sandbox Code Playgroud)
并重新缩放图像,记下极值的变换:
xmax'=xmax*Sx+m*ymax
ymax'=ymax*Sy
Run Code Online (Sandbox Code Playgroud)
在我的代码中看起来像这样
%MatLab
AffineFrame=cv.warpAffine(RealFrame,[CholScale,[0;0]],...
'DSize',[RealFrameSize(2)*(1/max(Chol(1,1),Chol(2,2))*Chol(1,1))+RealFrameSize(1)*Chol(1,2)/Chol(1,1),...
RealFrameSize(1)*(1/max(Chol(1,1),Chol(2,2))*Chol(2,2))]);
Run Code Online (Sandbox Code Playgroud)
瞧!