繁体   English   中英

从两个图像进行OpenCV转换

[英]OpenCV transformation from two images

有一个MATLAB示例,该示例匹配两个图像并输出旋转和缩放: https//de.mathworks.com/help/vision/examples/find-image-rotation-and-scale-using-automated-feature-matching。 HTML?requestedDomain = www.mathworks.com

我的目标是使用C ++重新创建此示例。 我使用的是关键点检测(Harris)相同的方法,这些关键点似乎与Matlab所发现的大部分相同。 到现在为止还挺好。

cv::goodFeaturesToTrack(image_grayscale, corners, number_of_keypoints, 0.01, 5, mask, 3, true, 0.04);
    for (int i = 0; i < corners.size(); i++) {
        keypoints.push_back(cv::KeyPoint(corners[i], 5));
    }

BRISK用于从关键点提取特征。

int Threshl = 120;
int Octaves = 8;
float PatternScales = 1.0f;

cv::Ptr<cv::Feature2D> extractor = cv::BRISK::create(Threshl, Octaves, PatternScales);
extractor->compute(image, mykeypoints, descriptors);

然后,使用flannbasedmatcher对这些描述符进行匹配。

cv::FlannBasedMatcher matcher;
matcher.match(descriptors32A, descriptors32B, matches);

现在的问题是我约有80%的比赛是错误的且无法使用。 对于相同的图像集,Matlab仅返回一些匹配项,而其中只有约20%的匹配项是错误的。 我尝试根据匹配距离值对C ++中的匹配进行排序,但没有成功。 值范围在300到700之间,即使距离最小的匹配也几乎完全不正确。

现在,20%的良好匹配足以计算偏移量,但是在检查错误的匹配上浪费了很多处理能力。 什么是对正确匹配进行排序的更好方法,或者我做错了什么明显的东西?

编辑:

我从Harris / BRISK切换到AKAZE,它似乎提供了更好的功能和匹配项,可以轻松地按其距离值进行排序。 唯一的缺点是更高的计算时间。 对于两张1000px宽的图像,AKAZE需要半分钟才能找到关键点(在PC上)。 我通过按比例缩小图像来减少这种情况,这可以接受大约3-5秒的时间。

您使用的方法会为每个点找到一个最近的邻居,无论它有多近。 共有两种策略:1.匹配集合A到集合B,将集合B到A并仅保留两个匹配中都存在的匹配。 2.使用2 knnMatch并执行比率检查,即仅保留1 NN比2 NN更近的匹配,例如d1 <0.8 * d2。

MATLAB代码使用SURF。 OpenCV还提供SURF,SIFT和AKAZE,请尝试其中一种。 比较而言,特别是SURF将很有趣。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM