0

如果确实出现在给定图像的顶部,我想检查一个特征(RAI的下半部分)。有时,影响检测的图像左侧或右侧可能存在一些噪音,例如一些垂直线或者待检测图像是没有特征(RAI)的完全不同的图像。比较区域的相似性

什么是实现我的期望的最佳方式?

我更喜欢使用OpenCV。但是,我应该使用ORB,FREAK,BRISK,SURF算法进行检测吗?我不确定这是否可以使用。我想知道是否还有其他好的选择,并寻求帮助。提前致谢。这个问题困扰了我很长一段时间。

The given image to be detected

+0

您可以使用您提到的任何特征描述符。无论哪个给你最好的结果。那就是说,那么问题是什么? – 2014-10-06 16:59:19

+0

我使用ORB描述符进行检测。但是,结果似乎并不好。 – user3217504 2014-10-07 08:17:56

+0

在某些领域,每个这些描述符都很坚强。即使你知道背后的理论,挑选一个可能有点棘手。 – 2014-10-07 08:29:56

回答

0

我曾尝试的代码如下。结果并不令人满意。我该如何改进?

#include <iostream> 
#include "opencv2/core/core.hpp" 
#include "opencv2/features2d/features2d.hpp" 
#include "opencv2/highgui/highgui.hpp" 
#include <iostream> 
#include <vector> 
using namespace cv; 
using namespace std; 
int main() 
{ 
Mat img_1 = imread("D:\\image\\img1.jpg"); 
Mat img_2 = imread("D:\\image\\img2.jpg"); 
if (!img_1.data || !img_2.data) 
{ 
    cout << "error reading images " << endl; 
    return -1; 
} 

ORB orb; 
vector<KeyPoint> keyPoints_1, keyPoints_2; 
Mat descriptors_1, descriptors_2; 

orb(img_1, Mat(), keyPoints_1, descriptors_1); 
orb(img_2, Mat(), keyPoints_2, descriptors_2); 

BruteForceMatcher<HammingLUT> matcher; 
vector<DMatch> matches; 
matcher.match(descriptors_1, descriptors_2, matches); 

double max_dist = 0; double min_dist = 100; 
//-- Quick calculation of max and min distances between keypoints 
for(int i = 0; i < descriptors_1.rows; i++) 
{ 
    double dist = matches[i].distance; 
    if(dist < min_dist) min_dist = dist; 
    if(dist > max_dist) max_dist = dist; 
} 
printf("-- Max dist : %f \n", max_dist); 
printf("-- Min dist : %f \n", min_dist); 
//-- Draw only "good" matches (i.e. whose distance is less than 0.6*max_dist) 
//-- PS.- radiusMatch can also be used here. 
std::vector<DMatch> good_matches; 
for(int i = 0; i < descriptors_1.rows; i++) 
{ 
    if(matches[i].distance < 0.6*max_dist) 
    { 
     good_matches.push_back(matches[i]); 
    } 
} 

Mat img_matches; 
drawMatches(img_1, keyPoints_1, img_2, keyPoints_2, 
    good_matches, img_matches, Scalar::all(-1), Scalar::all(-1), 
    vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS); 
imshow("Match", img_matches); 
cvWaitKey(); 
return 0; 
}