由于isRigid函数,Imwarp因顺序刚性变换而失败

时间:2014-09-08 15:09:01

标签: matlab image-processing video-processing

我正在执行某些视频帧的连续严格转换。 代码如下所示:

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,每个视频都不同。

您认为问题是什么,以及如何解决?

2 个答案:

答案 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的问题......我怀疑你的'刚性'问题是一样的。