我正在写关于兴趣点检测器和描述符的定性评估研究。我已经阅读了所有 Mikolajczyk 论文以及 Datta 等人的大部分调查。等等。现在我正在OpenCV中实现一个评估工具。我会采取图像。一种称为源图像,一种称为比较图像。
1.) 检测器:Mikolajczyk 使用可重复性标准、对应计数、匹配分数和其他指标来评估检测器的性能。我会使用可重复性和匹配区域的对应计数。
2.) 描述符:这里我将使用匹配区域上广泛使用的召回率和精度来描述描述符的性能。
到目前为止,我的问题是:这两个都是评估的好指标吗?
现在我正在尝试实现这是 OpenCV 并且需要有人来告诉我这是否可以做到。在这里,我使用 SURF-Detector 和 -Descriptor 来测试指标。Recall 和 Precision 还没有实现,但是有一个函数计算这个。
#include <opencv.hpp>
#include "opencv2/core/core.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/nonfree/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
int startSURF() {
std::cout << "Starting " << std::endl;
cv::Mat sourceImage = cv::imread("collection_1/DSCN5205.JPG",
CV_LOAD_IMAGE_COLOR);
cv::Mat comparisonImage = cv::imread("collection_1/DSCN5207.JPG",
CV_LOAD_IMAGE_COLOR);
if (!sourceImage.data) {
std::cout << "Source-Image empty" << std::endl;
return -1;
} else if (!comparisonImage.data) {
std::cout << "Comparison-Image empty" << std::endl;
return -1;
}
//Detect keypoint with SURF
int minHessian = 400;
cv::Mat sourceMatchedImage, comparisonMatchedImage;
std::vector<cv::KeyPoint> sourceKeypoints, comparisonKeypoints;
cv::SurfFeatureDetector surfDetect(minHessian);
surfDetect.detect(sourceImage, sourceKeypoints);
surfDetect.detect(comparisonImage, comparisonKeypoints);
//Calculate the SURF-Descriptor
cv::SurfDescriptorExtractor surfExtractor;
surfExtractor.compute(sourceImage, sourceKeypoints, sourceMatchedImage);
surfExtractor.compute(comparisonImage, comparisonKeypoints,
comparisonMatchedImage);
//Flann-Matching
cv::FlannBasedMatcher flann;
std::vector<cv::DMatch> matches;
flann.match(sourceMatchedImage, comparisonMatchedImage, matches);
//Repeatability and Correspondence-Counter
float repeatability;
int corrCounter;
cv::Mat h12;
std::vector<cv::Point2f> srcK;
std::vector<cv::Point2f> refK;
for (int i = 0; i < matches.size(); i++) {
srcK.push_back(sourceKeypoints[matches[i].queryIdx].pt);
refK.push_back(comparisonKeypoints[matches[i].queryIdx].pt);
}
std::cout << "< Computing homography via RANSAC. Treshold-default is 3" << std::endl;
h12 = cv::findHomography( srcK,refK, CV_RANSAC, 1 );
cv::evaluateFeatureDetector(sourceImage, comparisonImage, h12,
&sourceKeypoints, &comparisonKeypoints, repeatability, corrCounter);
std::cout << "repeatability = " << repeatability << std::endl;
std::cout << "correspCount = " << corrCounter << std::endl;
std::cout << ">" << std::endl;
std::cout << "Done. " << std::endl;
return 0;
}
我不确定这段代码是否有效,因为 SURF 对我的旋转近 45° 的测试图像的重复性很差(例如 0.00471577)。有人看到代码有问题吗?
有没有办法在没有 RANSAC 的情况下评估检测器?我没有找到一个尚未实现的方法。默认值 3 是一个好的阈值吗?我可以覆盖它,但问题是一个好的阈值只能由实验结果确定。但我需要为所有检测器设置一个强大的默认值。
我想我绝对需要单应性。但是我从来没有找到一种方法来为可重复性测量设置定位误差 ε。有没有办法设置ε?
很多问题。我希望我足够具体,但如果有问题请发表评论,我会尽力回答以便在这里获得帮助。祝你圣诞快乐!