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; 
}