3D 재구성 (2) Sift 피쳐 추출 및 일치

4294 단어 OpenCV3차원 재건
죄송합니다.
//         100 
    nth_element(matches.begin(), matches.begin() + 99, matches.end());
    matches.erase(matches.begin() + 99, matches.end());

잘못 썼어. 99를 00으로 썼어. 그래서 일치하는 결과를 볼 수 없었어. 여기 바뀌었어. - - - - - - - - - - - - - - - Opencv로 Sift 특징 추출과 일치하는 코드를 만들었어. Sift 특징에 대한 상세한 설명을 보고 싶으면'Distinctive Image Features'또는 제가 최근에 SIFT 알고리즘에 대한 상세한 설명 세 편을 썼습니다. SIFT 알고리즘 상해(1) 요약과 척도 공간 검측 SIFT 알고리즘 상해(2) 극치점의 정확한 위치와 특징점 방향의 계산 SIFT 알고리즘 상해(3) 특정점 설명서의 생성도 제가 참고한 자원이 있습니다.
다음은 내 코드입니다.
//  Opencv  SIFT     
//lhc 2016-07-08

#include 
#include 
#include 
#include 
#include  
#include 

using namespace std;
using namespace cv;

int main()
{
    Mat image1 = imread("G:\\ET\\et000.jpg");
    Mat image2 = imread("G:\\ET\\et001.jpg");
    //Sift   
    SiftFeatureDetector detector;

    //            
    vector image1KeyPoint, image2KeyPoint;

    //     
    detector.detect(image1, image1KeyPoint);
    detector.detect(image2, image2KeyPoint);

    //           
    Mat imageOutput1;
    Mat imageOutput2;
    drawKeypoints(image1, image1KeyPoint, imageOutput1, Scalar(0, 255, 0));
    drawKeypoints(image2, image2KeyPoint, imageOutput2, Scalar(0, 255, 0));

    //Sift      
    SiftDescriptorExtractor extractor;
    Mat descriptor1, descriptor2;
    //  Sift     
    extractor.compute(imageOutput1, image1KeyPoint, descriptor1);
    extractor.compute(imageOutput2, image2KeyPoint, descriptor2);

    //    
    BruteForceMatcherfloat>> matcher;
    vector matches;
    matcher.match(descriptor1, descriptor2, matches);

    //         100 
    nth_element(matches.begin(), matches.begin() + 99, matches.end());
    matches.erase(matches.begin() + 99, matches.end());

    //     
    Mat image_matched;
    drawMatches(imageOutput1, image1KeyPoint, imageOutput2, image2KeyPoint, matches, image_matched);

    imshow("image1", imageOutput1);
    imshow("image2", imageOutput2);
    imshow("image_matched", image_matched);
    waitKey(0);
    return 0;
}

여기에 또 다른 Opencv의 실험 방법이 있는데 상세하다. 또한 Opencv가 자체로 가지고 있는 SIFT 특징 검출 방법은 연산 속도가 비교적 느리고 CPU로 달려야 하며 전원을 켜지 않아야 한다. 외국에서 GPU로 달리는 Sift 특징 검출을 썼지만 실행되지 않았다. 여기서 SiftGPU: A GPU Implementation of Scale Invariant Feature Transform(SIFT)

좋은 웹페이지 즐겨찾기