我有2张文字图片,其中第一张图片的右侧与第二张图片的左侧重叠(从左到右拍摄同一页文字的2张部分照片)。 我想缝合图像,我正在尝试一种功能匹配的方法。 我已尝试使用来自OpenCV网站http://docs.opencv.org/trunk/doc/py_tutorials/py_feature2d/py_matcher/py_matcher.html#matcher
的ORB功能搜索+强力功能匹配的示例在我的情况下完全关闭(找不到任何正确的匹配,所有误报)至少使用功能搜索的默认参数。如果它使用了角落,那么在文本的情况下它会很难。
如何通过功能匹配更可靠地匹配此类图像和文本?我应该为ORB搜索算法指定一些不同的非默认参数吗?使用不同的算法和不同的参数?
如果没有特征匹配,我可以使用其他方法与Open CV进行此对齐吗?
Mat p1 = new Mat("part1.jpg", LoadMode.GrayScale);
Mat p2 = new Mat("part2.jpg", LoadMode.GrayScale);
var orb = new ORB();
Mat ds1;
var kp1 = DetectAndCompute(orb, p1, out ds1);
Mat ds2;
var kp2 = DetectAndCompute(orb, p2, out ds2);
var bfMatcher = new BFMatcher(NormType.Hamming, crossCheck: true);
var matches = bfMatcher.Match(ds1, ds1);
var tenBestMatches = matches.OrderBy(x => x.Distance).Take(10);
var res = new Mat();
Cv2.DrawMatches(p1, kp1, p2, kp2, tenBestMatches, res, flags: DrawMatchesFlags.DrawRichKeypoints);
using (new Window("result", WindowMode.ExpandedGui, res))
{
Cv2.WaitKey();
}
private static KeyPoint[] DetectAndCompute(ORB orb, Mat p1, out Mat ds1)
{
var kp1 = orb.Detect(p1);
ds1 = new Mat();
orb.Compute(p1, ref kp1, ds1);
return kp1;
}
答案 0 :(得分:1)
有趣的问题。关于ORB方法我想到的是,由于我们正在尝试处理的主题(纸上印刷的字母),它可能导致许多误报。首先,我们要检测可能的特征的复杂性 - 各种字符组合在一起,与特征尺寸相比相对较小。增加特征的大小会迅速增加它们的可能数量。其次,你可以在属于不同单词的某个单词的开头检测到相同的字母,这样你就不能单独依赖每个检测到的匹配,而不是将信息组合在一起。一般来说,我会尝试调整一个orb探测器补丁大小(C++ case),试图平衡它的大小。并尝试SIFT或SURF,也许他们会在你的情况下有更好的结果。
另一种方法,绝对是蛮力。根据您提供的示例,应该可以检测单独的单词(阈值处理 - > blob检测)。因此,让我们假设我们已经检测到带有单词的blob。假设我们有一些设置A和B,分别从左右图像中检测到的单词。然后我们应该找到A x B中每对单词的函数overlap()的最大值:
pos = arg_max {(a,b)in A x B:重叠(a,b)}
重叠函数是任何带有两个图像和anc计算其相似性的函数。你可以在那里使用例如直方图比较,绝对差值之和(wiki)或任何能够平衡准确度和性能的模板匹配算法。比较两个单词的图像时,它应该对平移,缩放和旋转不变,这也会增加复杂性。
一般来说,问题并不容易,因此研究很有趣。