0

对于图像马赛克应用程序,我获取了描述符的匹配并将其存储在一个矩阵匹配 2xM 中。我现在想用仿射应用 Ransac,所以我的随机样本是 2x3 矩阵,然后我尝试应用代码

[tform,inlier1,inlier2] =estimateGeometricTransform(sample(1,:),sSample(2,:),'仿射');

这似乎不起作用,因为它要求我的列为 2,将其转换为 3x2 也不起作用,因为对于仿射我需要 3 个对应点。

Matches 也只返回匹配描述符的索引,我如何提取它的坐标并将其应用于我的 tform 转换?

[f,d] = vl_sift(image1);
[f1,d2] = vl_sift(image2);
[matches, scores] = vl_ubcmatch(d, d2) ;

ranMatch = randperm(size(matches,2),3); 
sample = matches(:,ranMatch);
[tform,inlier1,inlier2] = 
estimateGeometricTransform(sample(1,:),sample(2,:),'affine');
4

1 回答 1

1

我没有你的数据来测试这个,也没有你的函数vl_siftvl_ubcmatch. 所以请原谅任何问题。

根据文档,包含由返回的点的坐标,f大小为 4xM(可能具有不同的 M),其中前两行是 x 和 y 坐标。f2vl_sift

我还将假设它matches是一个 2xN 数组,其中matches(1,:)表示f并且matches(2,:)是 的索引f2,因此这f(1:2,matches(1,i))是对应于 的点f2(1:2,matches(2,i))请仔细检查这个假设,文档没有指定输出。

您应该能够找到两组点之间的转换,如下所示:

matched_f = f(1:2,matches(1,:))';
matched_f2 = f2(1:2,matches(2,:))';
[tform,inlier1,inlier2] = estimateGeometricTransform(matched_f,matched_f2,'affine');

这将使用所有匹配的点,并且还会丢弃异常值。

有关详细信息,请参阅estimateGeometricTransform.

于 2018-03-23T22:01:30.907 回答