android - openCV 单应输出掩码值用作透视误差的内点?

标签 android opencv computer-vision object-detection homography

为了找到合适的匹配对象识别/检测,我使用了以下方法。

在这里我找到了两次单应性,从第一次单应性开始使用输出掩码作为过滤器来寻找第二次单应性的输入关键点。

我正在使用如下所示的特征描述符和提取器选项

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/

相关文章:

python - 语义分割训练时 Keras 损失为 NaN

android - 如何修复 "Content is not allowed in prolog"构建错误?

java - 即使在检查 null 之后,比较方法也违反了它的一般契约(Contract)

c++ - CPP OpenCV - 尝试根据边缘裁剪图像

java - 如何检测图像是照片、剪贴画还是线条图?

c# - 忽略图像中的明亮运动

java - Android:无法在未调用 Looper.prepare() 运行新线程的线程内创建处理程序

android - 带有自定义适配器的 ListView,在 Fragment 中不会触发 onItemClick 事件

android - 设置 ROI OpenCV Android 时出错

python - 将NumPy图片发送到 channel 而不用discord.py保存