我正在执行某些视频帧的连续严格转换。 代码如下所示:
lastReg = imregtform(video(:,:,i), video(:,:,i), 'rigid', optimizer, metric);
for i = 2:finalFrame
i
% Save moving and fixed images into matrices (needs later)
Imob = video(:,:,i);
Ifix = video(:,:,1);
% Get affine transformation object
lastReg = imregtform(Imob, Ifix, 'rigid',...
optimizer,metric,'InitialTransformation',lastReg);
% Register
videoReg(:,:,i) = imwarp(Imob,lastReg,'OutputView',imref2d(size(Ifix)));
end
如您所见,代码递归地使用存储在" lastReg"中的最后一个注册参数,这是前一帧对使用的最后一个刚性注册。
一切正常,但突然间我收到了这个错误
Error using imregtform>validateInitialTransformation (line 502)
The isRigid method of the InitialTransformation must return true when
TransformationType is 'rigid'.
事实上,如果我键入" isRigid(lastReg)"我得到零。
奇怪的是,它发生了一种随机的"进入for循环!更确切地说:
1)代码适用于for循环的某些循环,而不是突然没有
2)每个视频序列在不同的迭代中给出错误 for loop,每个视频都不同。
您认为问题是什么,以及如何解决?
答案 0 :(得分:0)
可能问题是由lastReg不是affine2D对象引起的。这只是猜测,所以 如果你输入这个怎么办:
% Get affine transformation object
lastReg = imregtform(Imob, Ifix, 'rigid',...
optimizer,metric,'InitialTransformation',lastReg);
lastReg = affine2d(lastReg.T); % transform the tform vector into an actual affine2d object.
% Register
videoReg(:,:,i) = imwarp(Imob,lastReg,'OutputView',imref2d(size(Ifix)));
答案 1 :(得分:0)
我想我可能找到了你问题的答案。我在翻译转换类型方面遇到了类似的问题。我在imregtform代码中做了一些调试,发现它返回的 有时 的affine2d对象有非常小的数字(如5.4e-9)而不是零它的T矩阵的一部分。 isTranslation和isRigid检查tform.T矩阵以确保某些部分正好为零。例如:
A.T = [1 0 0; 0 1 0; X Y 1];
B.T = [1 0 0; 5.4e-9 1 0; X Y 1];
isTranslation(A) = true
isTranslation(B) = false
作为一种解决方法,我必须通过imregtform对tform对象输出进行后处理,以将任何随机的小数字归零。然后,我可以使用前一次调用中的后处理tform为下一次imregtform调用播种。
我刚刚向MathWorks提交了一份错误报告,希望他们可以为将来的版本修复它。
这就是我的'翻译'转换类型使用imregtform的问题......我怀疑你的'刚性'问题是一样的。