0

주어진 이미지의 상단에 하나의 기능 (RAI의 하단 부분)이 있는지 확인하고 싶습니다. 일부 수직선과 같이 감지에 영향을 미치는 이미지의 왼쪽이나 오른쪽에 약간의 노이즈가 있거나 감지 할 이미지가 기능 (RAI)이없는 완전히 다른 이미지 일 때가 있습니다.유사점 비교 영역

내 기대치를 달성하는 가장 좋은 방법은 무엇입니까?

저는 OpenCV를 사용하는 것을 선호합니다. 하지만 ORB, FREAK, BRISK, SURF 알고리즘을 사용해야합니까? 이것이 대략적인 사용 사례인지 확실하지 않습니다. 다른 좋은 선택이 있는지 궁금해하고 도움을 요청하십시오. 미리 감사드립니다. 이 문제는 내게 꽤 오랜 시간이 걸린다.

The given image to be detected

+0

언급 한 기능 설명자를 사용할 수 있습니다. 어느 것이 든 최상의 결과를 제공합니다. 그렇다면 질문은 무엇입니까? –

+0

탐지에 ORB 설명자를 사용했습니다. 그러나 그 결과는 좋지 않은 것처럼 보입니다. – user3217504

+0

이러한 디 스크립트가 강하게 나타나는 특정 영역이 있습니다. 당신이 그 이론을 알고 있다고하더라도, 하나 따기는 약간 까다로울 수 있습니다. –

답변

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