为了找到合适的匹配对象识别/检测,我使用了以下方法。
在这里我找到了两次单应性,从第一次单应性开始使用输出掩码作为过滤器来寻找第二次单应性的输入关键点。
我正在使用如下所示的特征描述符和提取器选项
FeatureDetector detector = FeatureDetector.create(FeatureDetector.ORB);
DescriptorExtractor extractor = DescriptorExtractor.create(DescriptorExtractor.ORB);
DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE);
matcher.match(descriptorRef, descriptor, matches);
List<DMatch> matchesList = matches.toList();
keypoints_RefList = keypointsRef.toList();
keypoints_List = keypoints.toList();
第一次计算 - 使用匹配中的所有关键点
///////// first calculation
for (int i = 0; i < matchesList.size(); i++) {
objList1.addLast(keypoints_RefList.get(matchesList.get(i).queryIdx));
sceneList1.addLast(keypoints_List.get(matchesList.get(i).trainIdx));
}
obj1.fromList(objList1);
scene1.fromList(sceneList1);
Mat hg1 = Calib3d.findHomography(obj1, scene1, 8, 10, mask1);
第二次计算 - 仅使用使用掩码 1 的掩码值匹配的内点关键点
///////// second calculation
for(int i=0; i < mask1.rows(); i++){
if(mask1.get(i,0)[0] == 1){ ////////this time add only where mask1 is 1
objList.addLast(keypoints_RefList.get(matchesList.get(i).queryIdx));
sceneList.addLast(keypoints_List.get(matchesList.get(i).trainIdx));
}
}
obj.fromList(objList);
scene.fromList(sceneList);
Mat hg = Calib3d.findHomography(obj, scene, 8, 10, mask);
现在mask1和mask是
mask1 : [0; 0; 0; 1; 0; 1; 1; 1; 0; 0; 0; 1; 1; 0; 1; 0; 0; 1; 1; 1; 0; 1; 0; 0; 0; 1; 0; 0; 1; 0; 0; 0; 1; 0; 0; 0; 0; 0; 1; 0; 1; 0; 1; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 1; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 1; 0; 0; 0; 0; 1; 0; 0; 0; 0; 1; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 1; 1; 0; 0; 0; 0; 0; 0; 0; 1; 0; 0; 0; 0; 0; 0; 0; 0; 0; 1; 0; 0; 1; 1; 1; 0; 0; 0; 1; 1; 0; 1; 1; 1; 1; 0; 0; 0; 0; 1; 1; 0; 0; 0; 0; 1; 0; 1; 1; 0; 1; 0; 1; 0; 1; 0; 0; 0; 1; 1; 1; 1; 0; 0; 1; 1; 1; 0]
mask : [0; 1; 0; 0; 1; 1; 1; 1; 0; 0; 1; 1; 1; 1; 1; 1; 1; 0; 0; 1; 1; 0; 0; 0; 0; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 0; 0; 0; 0; 0; 0; 1; 1; 1; 1; 1; 1; 1; 1]
现在,由于第二个单应性的所有输入都是内点,掩码值应该全部为 1,但绝不会全为 1。有时我在掩码中得到更多的零。
单应性 3x3 输出 hg1 和 hg 有一些负值是否可以接受或者可能有什么问题?
我应该使用什么方法来过滤好的关键点,以便我得到正确的单应矩阵并且透视投影是正确的?
最佳答案
如果不正确理解您正在使用的应用程序和图像,则很难判断(例如,单应性是否适用于您的情况)。
尽管如此,您是否尝试过 RANSAC。您的所有特征匹配可能都不正确,可能有很多嘈杂的匹配导致您的单应性估计不正确。
关于android - openCV 单应输出掩码值用作透视误差的内点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18370564/