ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • OpenCV SURF로 이미지 매칭 테스트
    OpenCV/OpenCV C++ 강좌 2019. 5. 11. 20:10




    OpenCV의 SURF 예제를 테스트  해보았습니다. 장면 이미지에서 특정 물체를 찾아내는 이미지 매칭 테스트입니다.


    업데이트

    2019. 3.  4

    2019. 5. 11



    윈도우에서 진행하려면  아래 글에 나온대로 OpenCV을 다시 컴파일한 후 진행해야 합니다.


    Visual Studio 2017용으로 OpenCV 4.0.1 빌드 하기 (opencv_contrib 포함)

    http://webnautes.tistory.com/1036


    Visual Studio 2019용으로 OpenCV 4.1.0 빌드 하기 (Extra 모듈 contrib 포함)

    https://webnautes.tistory.com/1329



    코드는 다음 링크에 있는 것을 수정해서 사용했습니다.

    https://github.com/opencv/opencv_contrib/blob/master/modules/xfeatures2d/samples/surf_matcher.cpp



    #include <iostream>
    #include <stdio.h>
    #include "opencv2/core.hpp"
    #include "opencv2/core/utility.hpp"
    #include "opencv2/core/ocl.hpp"
    #include "opencv2/imgcodecs.hpp"
    #include "opencv2/highgui.hpp"
    #include "opencv2/features2d.hpp"
    #include "opencv2/calib3d.hpp"
    #include "opencv2/imgproc.hpp"
    #include "opencv2/xfeatures2d.hpp"

    using namespace cv;
    using namespace cv::xfeatures2d;

    const int LOOP_NUM = 10;
    const int GOOD_PTS_MAX = 50;
    const float GOOD_PORTION = 0.15f;

    int64 work_begin = 0;
    int64 work_end = 0;

    static void workBegin()
    {
    work_begin = getTickCount();
    }

    static void workEnd()
    {
    work_end = getTickCount() - work_begin;
    }

    static double getTime()
    {
    return work_end / ((double)getTickFrequency()) * 1000.;
    }

    struct SURFDetector
    {
    Ptr<Feature2D> surf;
    SURFDetector(double hessian = 800.0)
    {
    surf = SURF::create(hessian);
    }
    template<class T>
    void operator()(const T& in, const T& mask, std::vector<cv::KeyPoint>& pts, T& descriptors, bool useProvided = false)
    {
    surf->detectAndCompute(in, mask, pts, descriptors, useProvided);
    }
    };

    template<class KPMatcher>
    struct SURFMatcher
    {
    KPMatcher matcher;
    template<class T>
    void match(const T& in1, const T& in2, std::vector<cv::DMatch>& matches)
    {
    matcher.match(in1, in2, matches);
    }
    };

    static Mat drawGoodMatches(
    const Mat& img1,
    const Mat& img2,
    const std::vector<KeyPoint>& keypoints1,
    const std::vector<KeyPoint>& keypoints2,
    std::vector<DMatch>& matches,
    std::vector<Point2f>& scene_corners_
    )
    {
    //-- Sort matches and preserve top 10% matches
    std::sort(matches.begin(), matches.end());
    std::vector< DMatch > good_matches;
    double minDist = matches.front().distance;
    double maxDist = matches.back().distance;

    const int ptsPairs = std::min(GOOD_PTS_MAX, (int)(matches.size() * GOOD_PORTION));
    for (int i = 0; i < ptsPairs; i++)
    {
    good_matches.push_back(matches[i]);
    }
    std::cout << "\nMax distance: " << maxDist << std::endl;
    std::cout << "Min distance: " << minDist << std::endl;

    std::cout << "Calculating homography using " << ptsPairs << " point pairs." << std::endl;

    // drawing the results
    Mat img_matches;


    drawMatches(img1, keypoints1, img2, keypoints2,
    good_matches, img_matches, Scalar::all(-1), Scalar::all(-1),
    std::vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);


    //-- Localize the object
    std::vector<Point2f> obj;
    std::vector<Point2f> scene;

    for (size_t i = 0; i < good_matches.size(); i++)
    {
    //-- Get the keypoints from the good matches
    obj.push_back(keypoints1[good_matches[i].queryIdx].pt);
    scene.push_back(keypoints2[good_matches[i].trainIdx].pt);
    }
    //-- Get the corners from the image_1 ( the object to be "detected" )
    std::vector<Point2f> obj_corners(4);
    obj_corners[0] = Point(0, 0);
    obj_corners[1] = Point(img1.cols, 0);
    obj_corners[2] = Point(img1.cols, img1.rows);
    obj_corners[3] = Point(0, img1.rows);
    std::vector<Point2f> scene_corners(4);

    Mat H = findHomography(obj, scene, RANSAC);
    perspectiveTransform(obj_corners, scene_corners, H);

    scene_corners_ = scene_corners;

    //-- Draw lines between the corners (the mapped object in the scene - image_2 )
    line(img_matches,
    scene_corners[0] + Point2f((float)img1.cols, 0), scene_corners[1] + Point2f((float)img1.cols, 0),
    Scalar(0, 255, 0), 2, LINE_AA);
    line(img_matches,
    scene_corners[1] + Point2f((float)img1.cols, 0), scene_corners[2] + Point2f((float)img1.cols, 0),
    Scalar(0, 255, 0), 2, LINE_AA);
    line(img_matches,
    scene_corners[2] + Point2f((float)img1.cols, 0), scene_corners[3] + Point2f((float)img1.cols, 0),
    Scalar(0, 255, 0), 2, LINE_AA);
    line(img_matches,
    scene_corners[3] + Point2f((float)img1.cols, 0), scene_corners[0] + Point2f((float)img1.cols, 0),
    Scalar(0, 255, 0), 2, LINE_AA);

    return img_matches;
    }

    ////////////////////////////////////////////////////
    // This program demonstrates the usage of SURF_OCL.
    // use cpu findHomography interface to calculate the transformation matrix
    int main(int argc, char* argv[])
    {

    UMat img1, img2;

    std::string outpath = "output.jpg";

    std::string leftName = "object.jpg";
    imread(leftName, IMREAD_GRAYSCALE).copyTo(img1);
    if (img1.empty())
    {
    std::cout << "Couldn't load " << leftName << std::endl;
    return EXIT_FAILURE;
    }

    std::string rightName = "scene.jpg";
    imread(rightName, IMREAD_GRAYSCALE).copyTo(img2);
    if (img2.empty())
    {
    std::cout << "Couldn't load " << rightName << std::endl;
    return EXIT_FAILURE;
    }

    double surf_time = 0.;

    //declare input/output
    std::vector<KeyPoint> keypoints1, keypoints2;
    std::vector<DMatch> matches;

    UMat _descriptors1, _descriptors2;
    Mat descriptors1 = _descriptors1.getMat(ACCESS_RW),
    descriptors2 = _descriptors2.getMat(ACCESS_RW);

    //instantiate detectors/matchers
    SURFDetector surf;

    SURFMatcher<BFMatcher> matcher;

    //-- start of timing section

    for (int i = 0; i <= LOOP_NUM; i++)
    {
    if (i == 1) workBegin();
    surf(img1.getMat(ACCESS_READ), Mat(), keypoints1, descriptors1);
    surf(img2.getMat(ACCESS_READ), Mat(), keypoints2, descriptors2);
    matcher.match(descriptors1, descriptors2, matches);
    }
    workEnd();
    std::cout << "FOUND " << keypoints1.size() << " keypoints on first image" << std::endl;
    std::cout << "FOUND " << keypoints2.size() << " keypoints on second image" << std::endl;

    surf_time = getTime();
    std::cout << "SURF run time: " << surf_time / LOOP_NUM << " ms" << std::endl << "\n";


    std::vector<Point2f> corner;
    Mat img_matches = drawGoodMatches(img1.getMat(ACCESS_READ), img2.getMat(ACCESS_READ), keypoints1, keypoints2, matches, corner);

    //-- Show detected matches
    namedWindow("surf matches", 0);
    imshow("surf matches", img_matches);
    imwrite(outpath, img_matches);


    // 일치하는 오브젝트 위치 표시하는 사각형 그리기
    cvtColor(img2, img2, COLOR_GRAY2BGR);
    line(img2, corner[0], corner[1], Scalar(0, 255, 0), 2, LINE_AA);
    line(img2, corner[1], corner[2], Scalar(0, 255, 0), 2, LINE_AA);
    line(img2, corner[2], corner[3], Scalar(0, 255, 0), 2, LINE_AA);
    line(img2, corner[3], corner[0], Scalar(0, 255, 0), 2, LINE_AA);
    imshow("draw square", img2);


    waitKey(0);
    return EXIT_SUCCESS;
    }




    장면이 되는 사진(scene.jpg)을 찍고, 그 중 물체(object.jpg) 하나만 따로 찍어서 테스트했습니다.

    입력 이미지 파일은 cpp 파일이 있는 위치에 저장했습니다.


    예제 실행 결과는 object.jpg에 저장됩니다. 확인해보면 실제 입력 이미지 2장을 붙여놓고 매칭되는 포인트를 선으로 연결한 것을 볼 수 있습니다.  





    프로그램을 실행하면 두개의 창이 보입니다.


    surf matches 창은 오브젝트 이미지와 장면 이미지를 붙여서 보여주며 매칭되는 포인트를 선으로 연결후..

    찾은 오브젝트를 초록색 사각형으로 그려줍니다.





    draw square 창은 장면 이미지만 보여주며.. 찾은 오브젝트 위치에 초록색 사각형으로 표시해줍니다.





    두 장의 이미지에서 각각 키포인트를 뽑아내고 SURF를 수행한 것까지해서 2초 정도 걸렸습니다.

    입력 이미지의 크기나 파라미터 변경에 따라 실행시간은 달라질 수 있습니다.


    FOUND 400 keypoints on first image

    FOUND 1046 keypoints on second image

    SURF run time: 1717.12 ms



    Max distance: 0.530129

    Min distance: 0.0675935

    Calculating homography using 50 point pairs.




    포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
    댓글로 알려주시면 빠른 시일내에 답변을 드리겠습니다.

    여러분의 응원으로 좋은 컨텐츠가 만들어집니다. 지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 : )

    유튜브 구독하기


    댓글 82

    • 이전 댓글 더보기
    • syj40886 2018.01.29 10:40


      opencv_xfeatures2d320.lib는 어디서 찾을 수 있나요..??

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2018.01.29 16:27 신고


        아래 포스팅을 참고하여 OpenCV를 다시 컴파일 해야 합니다.

        Visual Studio 2017용으로 OpenCV 3.4 빌드 하기 (opencv_contrib 포함)

        http://webnautes.tistory.com/1036

    • lee 2018.02.18 18:39


      안녕하세요 . 포스팅을 보고 실행을 시켜보려 했는데 진입점이 정의되지 않았다 라는 오류가 뜨는데 해결 할 수 있는 방법이있을까요??
      감사합니다

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2018.02.18 18:43 신고


        혹시 비쥬얼스튜디오 2017 이전 버전을 사용중인가요? 그렇다면 윈32 콘솔 프로젝트를 생성해서 해보세요

      • lee 2018.02.18 19:50


        이전 포스팅을 보고 따라하여 2017버전을 사용중입니다.

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2018.02.18 20:22 신고


        메뉴에서 프로젝트 > 속성을 선택

        왼쪽 항목에서 링커 > 고급을 선택

        진입점 항목에 main 입력

        그리고 나서 소스 코드에서 main함수를
        int main()으로 수정해보세요..

      • lee 2018.02.18 23:44


        친절한 답변 정말 감사드립니다.
        이제 실행까지 가능하였는데
        "컴퓨터에 opencv_woeld304d.lib.dll이 없어 프로그램을 시작할 수 없습니다"
        라고 떴는데 제가 설치 부분에서 잘못한 것 일까요?

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2018.02.19 12:56 신고


        프로젝트 설정에서 다음 부분을 확인해보세요.

        속성 페이지 창에서 구성 속성 > 디버깅을 선택하고 환경 항목에  OpenCV 라이브러리  DLL 파일 위치를 입력합니다.

        PATH=C:\opencv-3.4.0\build\x64\vc15\bin;%PATH%

      • lee 2018.02.19 13:58


        말해주신 대로 속성창을 들어 가봤는데
        제대로 돼있습니다.
        혹시 그럼 구글에서 검색한후 다운을 받을 수 있을까요?

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2018.02.19 14:09 신고


        dll파일은 opencv 빌드 결과 얻은 파일입니다. 해당 경로에 dll파일이 있는지 확인해보세요

      • lee 2018.02.19 14:25


        폴더를들어가서 확인을 했는데
        opencv_world340d.dll 는 있고
        opencv_world340.dll 는 없는데 실행을 시키면 opencv_world340d.dll가 없다고 나오네요,,, 너무 많은 질문 죄송합니다

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2018.02.19 17:36 신고


        다음처럼 dll 파일을 복사해주면 됩니다.

        프로젝트폴더\\x64\\Debug에 opencv_world340d.dll

        프로젝트폴더\\x64\\Release에 opencv_world340.dll

    • tayo 2018.02.19 15:53


      윗분과 같은 질문인데 opencv_340d.dll이 존재 하는데도 실행이 안되네요. 해결 방법이 있나요??

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2018.02.19 17:36 신고


        다음처럼 dll 파일을 복사해주면 됩니다.

        프로젝트폴더\\x64\\Debug에 opencv_world340d.dll

        프로젝트폴더\\x64\\Release에 opencv_world340.dll

    • young919 2018.02.22 14:41


      안녕하세요 게시글을 보고 연습중인 학생입니다.
      실행을 시켯는데 프롬포트 창이 나오고 initialize opencl runtime 만 나오고 사진이 뜨지 않습니다
      해결할 방법이 있나요...????

    • hye 2018.03.27 18:48


      안녕하세요! wm 작성자분 처럼 저도 실시간웹캠에서 지정된 이미지를 계속적으로 인식이 가능하게 하고 싶습니다.
      surf를 자세히 배우지 않아서 surf 부분을 어느정도 추가해야하는지 모르겠습니다.
      위에 내용중 어느부분을 추가적으로 쓰면 될까요?

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2018.03.27 21:00 신고


        동영상 캡처하는 루프만 추가하면 됩니다.

        오래전 포스팅이긴 하지만.. 아래 포스팅을 참고해보세요..

        opencv surf로 이미지 매칭 동영상 태스트
        http://webnautes.tistory.com/776

      • hye 2018.03.28 19:04


        감사합니다.!
        그리고 한가지 더 질문이 있는데 카메라에 지정된 물체가 인식될때 픽셀위치의 좌표값을 전송하고 싶습니다..
        혹시 이부분은 어떤것을 사용해야할까요?

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2018.03.28 22:59 신고


        drawGoodMatches 함수에서

        다음 부분이 장면 영상에서 물체를 찾은 경우 초록색 사각형을 그려주는 부분입니다.

        //-- Draw lines between the corners (the mapped object in the scene - image_2 )
        line(img_matches,
        scene_corners[0] + Point2f((float)img1.cols, 0), scene_corners[1] + Point2f((float)img1.cols, 0),
        Scalar(0, 255, 0), 2, LINE_AA);
        line(img_matches,
        scene_corners[1] + Point2f((float)img1.cols, 0), scene_corners[2] + Point2f((float)img1.cols, 0),
        Scalar(0, 255, 0), 2, LINE_AA);
        line(img_matches,
        scene_corners[2] + Point2f((float)img1.cols, 0), scene_corners[3] + Point2f((float)img1.cols, 0),
        Scalar(0, 255, 0), 2, LINE_AA);
        line(img_matches,
        scene_corners[3] + Point2f((float)img1.cols, 0), scene_corners[0] + Point2f((float)img1.cols, 0),
        Scalar(0, 255, 0), 2, LINE_AA);

    • 우분투초보 2018.06.07 16:42


      안녕하세요 작성자님 제가 버젼이 3.4.1 버젼 이여서 질문 드립니다.
      우선 빌드 적용법 예제 에서도 잘 실행이 되었고
      이번에 이미지 매칭 테스트에서 전체 장면사진과 그중 물체 사진을 찍고선 해당 폴더에 넣었는데요
      cmd창에 요고만 나오고 그이상은 진행이 안되서 질문을 드립니다....

      [ INFO:0] Initialize OpenCL runtime...

      혹시 버젼이 높아져서 무언가 잘못 됬나요?

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2018.06.07 16:46 신고


        사진이 큰경우 특징점을 뽑아내는데 오래걸릴 수 있습니다 .

        우선 이미지 너비가 640이 되도록 크기를 줄여보세요.

      • 우분투초보 2018.06.07 16:51


        아! 멍좀 때리고 보니깐 나왔네요 확실히 이미지 크기가 크고 특징뽑느라 걸리네요... 작성자님은 3436ms 걸렸는데 16000 ms 걸렸습니다

    • Favicon of https://sandoooo.tistory.com BlogIcon sandoooo 2019.03.03 14:40 신고


      ㅠㅠ 올려주신 글을 정말 유익하게 잘 보고 있습니다 감사합니다

      다름이 아니라 포스터에 올려주신 강좌를 잘 따라가고 있는데

      지금 이 surf 이미지 매칭 에서 오류가 뜨네요...

      색감지 까지는 정말 잘되었는데...

      파일소스를 열 수 없습니다 "opencv2/xfeatures2d.hpp" 11줄

      namespace "cv"에 xfeatures2d 멤버가 없습니다 14줄

      그리고

      포함파일을 열 수 없습니다 opencv2/xfeatures2d.hpp

      이렇게 뜨네요 뭐가문제일까요...하 ㅜㅜ

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.03.03 14:42 신고


        Visual Studio에서 작업중이라면 아래 글을보고 OpenCV를 빌드해야 합니다.

        https://webnautes.tistory.com/1036

      • Favicon of https://sandoooo.tistory.com BlogIcon sandoooo 2019.03.04 17:12 신고


        감사합니다 ㅠㅠ 알고보니 프로젝트 설정하는 부분에서 폴더 설정이 잘못되어 있었습니다 ㅠㅠ
        그런데 실행은 되는데 파일을 load할 수 없다고 뜨네요... object,scene 파일을 이름 그대로 cpp파일있는곳에 넣어놨는데....

        Couldn't load object.png

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.03.04 17:17 신고


        visual studio를 업데이트하고 해보세요.버전에 따라 인식하는 위치가 다르더라구요

      • Favicon of https://sandoooo.tistory.com BlogIcon sandoooo 2019.03.04 17:29 신고


        엊그제 깔았는데요 ..ㅠㅠㅠ

    • 김영재 2019.03.28 10:41


      안녕하세요 .
      정말 블로그 자료 잘보고있습니다.
      OpenCV SURF로 이미지 매칭 테스트 코드 돌려보니 잘 매칭이 되서 영역을 그려줫는데
      이부분을 수정해서 영상에서 오브젝트를 찾아서 따라다니는 코드를 만들고싶습니다.
      코드에서 이미지 넣어주는 부분을 영상에서 프레임 얻어와서 넣어주면 가능할까요?
      이방법으로 특정 물체를 인식하는 방법이 딜레이가 많이 걸릴지.... 여부가궁금해서 댓글남깁니다

    • machine 2019.03.28 15:56


      안녕하세요. 소스분석하다가 궁금한것이 생겨서 이렇게 여쭤봅니다.
      double minDist = matches.front().distance;
      double maxDist = matches.back().distance;
      부분이 있는데 front와 back은 정확히 어느부분이며 distance는 어느 길이르 반환하는건지 이해가 안갑니다.ㅜ

      그리고
      matcher.match(in1, in2, matches); 이 부분이 함수가 정의가 안되어 있는데 무슨 문제인거죠?ㅜ

      마지막으로
      Mat H = findHomography(obj, scene, RANSAC);
      perspectiveTransform(obj_corners, scene_corners, H);
      perspectiveTransform 요녀석은 4개지점 와핑하려고 사용한거 같은데 H값이 왜필요하고 findHomography 를 하면 두 이미지에서 차이점을 알게해주는거로 이해하면
      되나요? RANSAC 알고리즘으로 findHomography 한거같은데 그렇게해서 Mat H 로 되면 어떻게 생기게 되는지 궁금합니다.

      감사합니다!

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.03.28 17:49 신고


        1. 길이순으로 저장되어 있는 vector에 저장된 길이에서 첫번째 것과 마지막것을 가져오는 것입니다.

        double minDist = matches.front().distance;
        double maxDist = matches.back().distance;


        2. KPMatcher의 메소드를 호출하는 것입니다.

        KPMatcher matcher;
        template<class T>
        void match(const T& in1, const T& in2, std::vector<cv::DMatch>& matches)
        {
        matcher.match(in1, in2, matches);
        }


        3. obj와 scene과의 관계를 H에 저장하여
        Mat H = findHomography(obj, scene, RANSAC);

        H를 사용하여 obj에서 획득한 코너점을 scene의 코너점으로 변환합니다.
        perspectiveTransform(obj_corners, scene_corners, H);

    • cloud 2019.04.02 09:29


      이미지 크기가 서로 다른 이미지를 매칭하면 에러가 뜨는데 사이즈가 다르면 매칭이 안되나요?

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.04.02 20:50 신고


        다음 글에 보이는 것처럼 이미지 크기가 달라도 동작합니다.
        https://webnautes.tistory.com/776

        다른 이유가 아닌지 에러를 다시 보세요

    • LeeJae 2019.05.06 16:19


      안녕하세요! ㅎㅎ 몇가지 질문있습니다.

      1. android studio에서 surf를 하면 속도가 조금 느려도 하고싶은데 "Android NDK + OpenCV 카메라 예제 및 프로젝트 생성방법(CMake 사용) " 이글에 적용해서 가능한가요??

      2. 조금씩 움직이는 화면(카메라)에서 surf를 사용하여 비교하는 이미지를 찾으려고하면 잘못잡을까요 ??

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.06 19:04 신고


        1. Android 용으로 OpenCV를 다시 컴파일해야 합니다. 왜냐하면 빌드되어 배포되는 패키지에는 surf가 포함되어 있는 extra module이 같이 빌드되어 있지 않기 때문입니다..

        빌드 방법은 다음 포스팅을 참고하세요.. extra module 위치를 추가해서 진행해야 합니다.
        https://webnautes.tistory.com/1268



        2. 정확히 무엇을 어떻게 찾으려는지 알 수가 없네요.


        안드로이드에서 surf 실행속도만 개선하면 괜찮을 듯합니다.

    • wisdom0111 2019.05.09 16:21


      안녕하세요.
      vs2015 opencv3.2 로 SURF 실습을 하고자 하는데요.
      환경설정 완료 후, 상단의 코드로 빌드를 하니, 하단과 같은 메시지가 뜨는데, 혹시 어떻게 하면 좋을까요...?

      1>c:\opencv\build\include\opencv2\core\mat.hpp(2586): warning C4819: 현재 코드 페이지(949)에서 표시할 수 없는 문자가 파일에 들어 있습니다. 데이터가 손실되지 않게 하려면 해당 파일을 유니코드 형식으로 저장하십시오.
      1>c:\opencv\build\include\opencv2\core\persistence.hpp : warning C4819: 현재 코드 페이지(949)에서 표시할 수 없는 문자가 파일에 들어 있습니다. 데이터가 손실되지 않게 하려면 해당 파일을 유니코드 형식으로 저장하십시오.
      1>c:\opencv\build\include\opencv2\core\utility.hpp : warning C4819: 현재 코드 페이지(949)에서 표시할 수 없는 문자가 파일에 들어 있습니다. 데이터가 손실되지 않게 하려면 해당 파일을 유니코드 형식으로 저장하십시오.
      1>c:\opencv\build\include\opencv2\core\utility.hpp : warning C4819: 현재 코드 페이지(949)에서 표시할 수 없는 문자가 파일에 들어 있습니다. 데이터가 손실되지 않게 하려면 해당 파일을 유니코드 형식으로 저장하십시오.
      1>c:\users\akuser\documents\visual studio 2015\projects\opencv-surf-test\opencv-surf-test\main.cpp(5): fatal error C1083: 포함 파일을 열 수 없습니다. 'opencv2/nonfree/nonfree.hpp': No such file or directory

      opencv 버전이 달라서 발생하는 문제 같은데,
      부득이 하게 새로운 버전이 아닌 3.2 버전으로 실습을 하고자 합니다.ㅠ

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.09 16:25 신고


        opencv를 다시 빌드해야 합니다.
        버전은 다르지만 다음 링크를 참고하여 진행하세요.
        https://webnautes.tistory.com/1036

    • sandoooo 2019.05.11 01:21


      안녕하세요
      항상 많은 도움을 받고있습니다! 감사합니다
      (유투브 구독도했습니다^^)
      다름이 아니라 matching 결과에 나오는 매칭점이랑 선이 표시되는것을 없애고 그냥 사각형? 만 표시되게 하고 싶은데 어떻게 하면 될까요?
      코드를 하나씩 주석처리하면서 결과를 봤는데 잘안되네요....

    • las 2019.05.13 02:35


      위와 같은 surf 매칭을 안드로이드 스튜디오로 코딩해서 안드로이드에서 구현하고 싶은데 코드를 어떤식으로 짜면 될까요
      관련 강좌 부탁드려도 될까요?

    • ASSDSF 2019.05.13 11:19


      scene 하나에 여러개 object를 두고 많은 이미지를 찾으려면 어떤 방식으로 접근해야할까요??
      응용해보려는데.... 잘안되네요 조언을 얻을 수 있을까요?

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.13 11:22 신고


        오브젝트 갯수만큼 장면과 각각 비교해봐야 합니다.

      • ASSDSF 2019.05.16 02:07


        각각의 object들을 scene와 비교하는데drawGoodMatches 이 부분이 문제인지 계속 오류가 뜨네요 ㅠㅠ

        SURFDetector surf2;

        SURFMatcher<BFMatcher> matcher2;


        for (int i = 0; i <= LOOP_NUM; i++)
        {
        if (i == 1)
        surf2(img3.getMat(ACCESS_READ), Mat(), keypoints1, descriptors1);
        surf2(img2.getMat(ACCESS_READ), Mat(), keypoints2, descriptors2);
        matcher2.match(descriptors1, descriptors2, matches);
        }
        workEnd();

        surf_time = getTime();



        std::vector<Point2f> corner2;

        Mat img_matches2 = drawGoodMatches(img3.getMat(ACCESS_READ), img2.getMat(ACCESS_READ), keypoints1, keypoints2, matches, corner2);
        //이 부분에서 오류발생


        line(img2, corner2[0], corner2[1], Scalar(0, 255, 0), 2, LINE_AA);
        line(img2, corner2[1], corner2[2], Scalar(0, 255, 0), 2, LINE_AA);
        line(img2, corner2[2], corner2[3], Scalar(0, 255, 0), 2, LINE_AA);
        line(img2, corner2[3], corner2[0], Scalar(0, 255, 0), 2, LINE_AA);


        이렇게 각각 비교하라는 말씀 맞으시죠??

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.16 05:30 신고


        에러메시지가 어떻게 뜨나요?

      • ASSDSF 2019.05.16 13:53


        처리되지 않은 예외 발생(0x00007FFA601CA388, Project.exe): Microsoft C++ 예외: cv::Exception, 메모리 위치 0x0000008BC89AE020.

        이렇게 뜹니다...

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.16 16:16 신고


        이미지가 제대로 로드되었는지 surf 시작전에 imshow로 화면에 보이게해서 확인해보세요.

      • Favicon of https://sandoooo.tistory.com BlogIcon sandoooo 2019.05.22 21:12 신고


        죄송합니다 다른 시험 일정 때문에 질문의 텀이 상당히 길어졌네요 ㅠㅠ

        말씀하신대로 이미지 3개 (object 2개, scene 1개) 모두 imshow 써서 이미지가 제대로 로드된걸 확인했습니다.

        위에서 말씀드린 에러가 뜨는 위치는 정확히 말씀드리면

        scene_corners_ = scene_corners;

        이 부분 입니다.

        두개의 이미지를 처리할때 왜 이부분에서 처리되지 않은 예외가 발생할까요,,,?


        (최대한 기존의 코드를 유지하면서 진행하려고 img3에 새 object를 넣고 기존의 img1(object)과 img2(scene)는 유지했습니다)

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.22 21:22 신고


        에러 원인을 알기 힘드내요.. 이미지 2장씩 나누어서 처리해보세요..

        오브젝트 이미지 한장과 장면 이미지 다수를 담은 배열을 비교하는게 불가능한건 아닌데 에러 원인 찾기가 쉽지 않네요

      • Favicon of https://sandoooo.tistory.com BlogIcon sandoooo 2019.05.22 21:27 신고


        ㅠㅠ 도움주셔서 감사합니다

        쉽지 않네요 이거.. ㅠ

    • 2019.06.01 23:51


      비밀댓글입니다

    • kang 2019.06.30 22:59


      안녕하세요. 잘 배웠습니다. 감사합니다.

      혹시 특정이미지로 여러 사진 중 해당사진에 근접한 이미지 검색 기능이 가능한 코드가 있을까요?

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.06.30 23:11 신고


        단순히 두 장의 사진을 비교하는 거라면 템플릿 매칭으로도 가능할듯합니다.

        다음 링크도 참고해보세요..
        https://stackoverflow.com/a/11541587

    • 김갑환 2020.01.07 12:18


      좋은 글 감사합니다. 혹시 매치되는 부분이 없을시 매칭되지않는다는 메시지를 띄우고 싶은데 다른이미지를 object로 했을 시 그냥 무의미한곳에 초록선이 만들어지네요.... 혹시 방법이 있을까요

    • 2020.01.21 17:39


      비밀댓글입니다

    • cj 2020.01.21 21:40


      A이미지와 유사한 B이미지가 있을시 A와 B가 몇퍼센트 유사한지 구하려면 어떤식으로 접근하는게 좋을까요?

Designed by Tistory.