반응형


2019. 4. 23

수정한 코드가 이미지 파일간 매칭을 위한 코드라 동영상에서 동작시 예외상황을 처리하지 못해서 추가했습니다.

충분히 테스트해보지 않아서 코드가 완벽하지 않습니다.



Visual Studio 2017용으로  컴파일한 OpenCV 4.0.1를 사용하여  SURF 테스트를 해보았습니다.

장면 이미지에서 특정 물체를 찾아내는 이미지 매칭 테스트입니다.


빌드 과정은 다음 포스팅을 참고하세요.



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

http://webnautes.tistory.com/1036  




xfeatures2d 모듈의 샘플 코드를 수정하여 사용했습니다.

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




실행하면 초록색 사각형이 보입니다. 인식시킬 물체를 사각형 안에 보여주고 스페이스바를 누릅니다.

영역에 있는 물체가 이미지로 복사됩니다.





이제 앞에서 얻은 이미지와 웹캠 영상을 비교하여 물체를 인식합니다. 제대로 인식된 경우 초록색 사각형이 보입니다.








LOOP_NUM를 10에서 5로 줄여서 속도를 개선한 상태입니다.



#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;
using namespace std;

const int LOOP_NUM = 5;// 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);

if (ptsPairs == 0) return img_matches;


//-- 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);

if (H.empty()) return img_matches;

perspectiveTransform(obj_corners, scene_corners, H);

//if (scene_corners.empty()) return img_matches;

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[])
{
Mat img_input, img_target;
UMat img_input_gray, img_target_gray;


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;

// OCL 활성화
ocl::setUseOpenCL(true);

//비디오 캡쳐 초기화
VideoCapture cap(0);
if (!cap.isOpened()) {
cerr << "에러 - 카메라를 열 수 없습니다.\n";
return -1;
}

cap.read(img_input);
if (img_input.empty()) {
cerr << "빈 영상이 캡쳐되었습니다.\n";
return -1;
}

int width = img_input.cols;
int height = img_input.rows;

int step = 0;


while (1)
{
// 카메라로부터 캡쳐한 영상을 frame에 저장합니다.
cap.read(img_input);
if (img_input.empty()) {
cerr << "빈 영상이 캡쳐되었습니다.\n";
break;
}

if (step == 1) {
cvtColor(img_input, img_input_gray, COLOR_BGR2GRAY);

//-- start of timing section

for (int i = 0; i <= LOOP_NUM; i++)
{
if (i == 1) workBegin();
surf(img_target_gray.getMat(ACCESS_READ), Mat(), keypoints1, descriptors1);
surf(img_input_gray.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(img_target_gray.getMat(ACCESS_READ), img_input_gray.getMat(ACCESS_READ), keypoints1, keypoints2, matches, corner);

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



// ESC 키를 입력하면 루프가 종료됩니다.
int key = waitKey(25);
if (key == 27)
break;
else if (key == 32) {
if (step == 0) {
img_input(Rect(width / 2 - 150, height / 2 - 150, 300, 300)).copyTo(img_target);
cvtColor(img_target, img_target_gray, COLOR_BGR2GRAY);

imshow("target", img_target);
step++;
}
}

if (step == 0)
{
rectangle(img_input, Rect(width / 2 - 150, height / 2 - 150, 300, 300), Scalar(0, 255, 0), 3);
}


// 영상을 화면에 보여줍니다.
imshow("Scene", img_input);
}


return 0;
}


반응형

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

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

유튜브 구독하기


제가 쓴 책도 한번 검토해보세요.

  1. wm 2017.07.09 13:33

    안녕하세요 opencv 3.2 비쥬얼 스튜디오 2017 연동해서 cmake로 빌드 하는거 잘 안됐었다고 했던 학생인데요

    ALL BUILD 는 되고 INSTALL이 안되었었는데 비쥬얼을 관리자 권한으로 열었더니 빌드가 되서 쓰고싶은 함수는 쓸 수 있게 되었습니다.

    근데 직접 짠 코드를 컴파일해보니 TBB관련해서 오류가 뜨던데 혹시 TBB만 따로 없애는 방법이 있나요?


    그리고 이 포스팅에 있는 예제 코드를 돌려봤더니

    0x00007FFC30DB0FE1(ucrtbased.dll)에(surfex.exe의) 처리되지 않은 예외가 있습니다. 0xC0000005: 0x0000000000000000 위치를 읽는 동안 액세스 위반이 발생했습니다..

    이렇게 오류가 뜹니다. 어떻게 해결 해야 되나요

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2017.07.10 11:10 신고

      정확한 원인은 모르겠지만 non-free 옵션때문에 디버그 모드는 문제가 있는 듯합니다.

      surf 테스트 해봤는데 릴리즈 모드에서만 정상 동작하네요.
      http://webnautes.tistory.com/1152


      TBB 제거하려면
      cmake-gui에서 다음 옵션들을 체크해제해주면 됩니다.
      MKL_WITH_TBB
      WITH_TBB

  2. dd 2019.03.16 15:25

    안녕하세요 질문이 있어서 댓글 답니다.
    혹시 화면의 여러 개의 물체들을 recognize할 수 있는 방법 아시나요??
    감사합니다.

  3. 김영재 2019.03.28 14:38

    안녕하세요
    해당 소스컴파일 성공해서 라즈베리파이 라즈비안에서 실행 시켯는데
    영상은 나오고 첨에 영역잡을때 스페이스바 입력을하면
    ASSERT: "false" in file qasciikey.cpp, line 501
    해당 오류가 발생하는데 혹시 이유알수있을까요>?

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

      입력이 한글 상태이면 문제가 생기는 것 같은데 다시 확인해보세요

  4. 김영재 2019.03.28 19:35

    Max distance: 0.374513
    Min distance: 0.0628333
    Calculating homography using 7 point pairs.
    ASSERT: "false" in file qasciikey.cpp, line 501
    중지됨

    한글 영어 다 해봣는데... 계속 이렇게 나오는데 혹시 이관련해서 디버깅 해보신적은 없으시져?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.03.28 20:00 신고

      이런경우는 첨입니다. 스페이스바가 아닌 숫자로 바꾸어보세요

  5. 김영재 2019.03.28 20:03

    네 다른걸로 바꾸니 실행됬습니다. ^^
    답변 감사합니다.

    혹시 제가 지금 침대에서 사람떨어지는걸 감지할려고 하는데
    opencv 어떤 방법을 써야 좋을지 조언좀 구할수 있을까여?

    좌우 침대 난간 영역을 잡고 그쪽 좌우 영역에 사람이 앉거나 사람이 넘어갈때를 감지 해야합니다..
    혹시 좋은 방법이 있으시면 조언좀 부탁드립니다.
    그리고 작성해주신 자료 정말 많은 도움이 되고있습니다. 감사합니다

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.03.28 22:26 신고

      사람 없는 장면을 찍다가 사람이 나타나면 감지하는 방법을 사용해야 할듯합니다.

      다음 글을 참고하세요
      https://webnautes.tistory.com/1248

  6. 윤영빈 2019.04.08 21:29

    opencv contrib 3.4.4 버전 빌드해서 visual studio 2015에 쓰고있는데,

    예제 코드를 받아서 실행시켜보면

    Debug Error!

    abort() has been called 라고 에러창이 뜨고

    console 창에는 OpenCV(3.4.4) Error: The function/feature is not implemented (This algorithm is patented and is excluded in this configuration; Set OPENCV_ENABLE_NONFREE CMake option and rebuild the library) in cv::xfeatures2d::SURF::create, file C:\opencv_contrib-3.4.4\modules\xfeatures2d\src\surf.cpp, line 1029

    라고 뜹니다.. 혹시 해결 도와주실 수 있으신가요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.04.08 21:54 신고

      opencv 빌드시 nonfree 옵션을 체크하지 않았다는 에러입니다. surf 사용하려면 필요한 옵션입니다.

  7. sandoooo 2019.04.23 13:17

    처리되지 않은 예외 발생(0x00007FFA5E28A388, OpenCV Test.exe): Microsoft C++ 예외: cv::Exception, 메모리 위치 0x00000066E1CFE650. 발생

    이라고 에러가 뜨네요...

    어떻게 해결해야할지 잘모르겠습니다.. ㅠㅠ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.04.23 13:20 신고

      코드를 그대로 사용했나요?

    • Sandoooo 2019.04.23 13:57

      예....
      유투브 올려주신 2019 비주얼 베이직이랑
      Opencv 4.1.0 설치해서
      코드 그대로 옮겨서 사용했는데
      첫 구동은 잘되더니
      그 이후에 계속 저러네요

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.04.23 22:38 신고

      이미지 기반 코드를 동영상에서 동작하게 해서 문제가 발생했네요..

      일단 오류가 나지 않게 해두었습니다.

      또 에러 발생시 디버그 모드로 해놓고 실행하여 명령 프롬프트 창에 보이는 에러 메시지를 알려주세여.

    • sandoooo 2019.04.24 00:02

      감사합니다 !! 유툽도 잘보고있어요!

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.04.24 00:08 신고

      감사합니다 : )

  8. Favicon of http://https://webnautes.tistory.com/1036 BlogIcon HH 2019.05.31 15:40

    코드 실행하니까 아래와 같은 오류가 떴습니다.

    오류 LNK1120 1개의 확인할 수 없는 외부 참조입니다.

    심각도 코드 설명 프로젝트 파일 줄 비표시 오류(Suppression) 상태
    오류 LNK2019
    "public: static struct cv::Ptr<class cv::xfeatures2d::SURF> __cdecl cv::xfeatures2d::SURF::create(double,int,int,bool,bool)" (?create@SURF@xfeatures2d@cv@@SA?AU?$Ptr@VSURF@xfeatures2d@cv@@@3@NHH_N0@Z) 외부 기호(참조 위치: "public: __cdecl SURFDetector::SURFDetector(double)" (??0SURFDetector@@QEAA@N@Z) 함수)에서 확인하지 못했습니다. Project6 C:\Users\H\source\repos\Project6\Project6\main.obj 1

    이렇게 뜨는데 제가 무엇을 잘못한걸까요??

    그리고 블로그 글 정말 많이 도움되었습니다. 정말 정말 감사합니다.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.31 15:50 신고

      프로젝트 설정에서 빌드한 OpenCV의 라이브러리 파일을 잘못 지정한게 아닌 가 싶습니다.

  9. h2r 2019.06.18 19:58

    안녕하세요 위의 소스코드를 실행 시켜보니 자꾸 이미지 매칭 테스트가 웹캠을 아무리 움직여봐도 안되네요ㅠ 동영상 매칭을 할려면 어떻게 하나요..??

  10. h2r 2019.06.18 22:39

    넵 처음에는 초록 사각형이 보이네요ㅠ 사각형안에 물체를 찍고나서 매칭이 이미지대 이미지로 되네요.. 동영상으로는 안되네요ㅠㅠ

  11. CV 2019.06.24 01:13

    https://webnautes.tistory.com/1036 이 링크와 https://webnautes.tistory.com/1132 이 링크를 잘 적용했습니다.
    https://webnautes.tistory.com/1132 이 링크의 예제 카메라 소스는 잘 작동하지만 동영상 매칭 코드는 아래와 같은 에러가 뜨네요..ㅜㅠ

    1>main.obj : error LNK2001: "public: static struct cv::Ptr<class cv::xfeatures2d::SURF> __cdecl cv::xfeatures2d::SURF::create(double,int,int,bool,bool)" (?create@SURF@xfeatures2d@cv@@SA?AU?$Ptr@VSURF@xfeatures2d@cv@@@3@NHH_N0@Z) 외부 기호를 확인할 수 없습니다.
    1>C:\Users\김형동\source\repos\CV_Matching_T\x64\Release\CV_Matching_T.exe : fatal error LNK1120: 1개의 확인할 수 없는 외부 참조입니다.

    어떻게 해야할까요...ㅠ
    ps) 비주얼 스튜디오의 버전은 2017버전입니다.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.06.24 05:23 신고

      아래 링크에서 컴파일한 라이브러리를 프로젝트에서 사용중인가요?

      https://webnautes.tistory.com/1036

    • CV 2019.06.24 13:37

      넵 다른점은 OpenCV 4.1.0으로 빌드 했습니다.

    • CV 2019.06.24 21:07

      surf = SURF::create(hessian);
      이 문장을 주석처리하면 디버그는 됩니다.
      하지만 스페이스 바를 누르면 한 3초뒤에 팅기면서 꺼져요...ㅠ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.06.24 21:28 신고

      컴파일시 nonfree 옵션을 선택했었나요?

      이거 문제 일 수도 있을 듯합니다.

      4.1.0에서도 똑같이 동작하는 코드라서요.

    • CV 2019.06.25 13:14

      CMake에서 nonfree검색해서 체크했습니다..!

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.06.25 13:47 신고

      혹시 라이브러리 파일이 world 외에 더 있는건 아닌지 확인해보세요.

      디버그와 릴리즈 모드를 바꾸어가면서도 해보구요

      헤더파일은 찾았는데 라이브러리를 못찾았다는 에러입니다.

    • CV 2019.06.25 14:51

      OpenCV버전을 혹시몰라서 4.1.0버전에서 4.0.1로 바꿔서 해봤습니다.
      라이브러리(C:opencv-4.0.1/build/x64/vc15\lib)에는
      opencv_world401.lib
      opencv_world401d.lib
      OpenCVConfig.cmake
      OpenCVConfig-version.cmake
      OpenCVModules.cmake
      OpenCVModules-debug.cmake
      OpenCVModules-release.cmake
      이렇게 들어있습니다.

      추가종속성에
      opencv_world401.lib (Release모드) / opencv_world401d.lib (Debug모드)
      kernel32.lib
      user32.lib
      gdi32.lib
      winspool.lib
      comdlg32.lib
      advapi32.lib
      shell32.lib
      ole32.lib
      oleaut32.lib
      uuid.lib
      odbc32.lib
      odbccp32.lib
      이렇게 등록되어있습니다.

      혹시 더 추가해야할게 있을까요??

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.06.25 18:31 신고

      제대로 한 듯합니다.. 빌드에 문제가 혹시 있나요?

    • CV 2019.06.26 15:48

      빌드시에는
      error LNK2001: "public: static struct cv::Ptr<class cv::xfeatures2d::SURF> __cdecl cv::xfeatures2d::SURF::create(double,int,int,bool,bool)" (?create@SURF@xfeatures2d@cv@@SA?AU?$Ptr@VSURF@xfeatures2d@cv@@@3@NHH_N0@Z) 외부 기호를 확인할 수 없습니다.

      이 에러만 뜨고 진전이 없습니다..ㅜ

      많은 질문에도 친절한 답변 정말 감사합니다.!

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

      구글에서 검색해봐도 원인을 찾기가 쉽지 않네요...

      world 옵션을 체크해제해서 xfeatures2d 이름이 포함된 라이브러리가 생성되는지 확인하고 라이브러리별로 따로 프로젝트 옵션에 추가해봐야 할 듯합니다.

    • CV 2019.07.04 19:05

      좋은 답변들 정말 감사합니다
      잘 해결되었어요!! ㅎㅎ

      혹시 매칭포인트가 3개정도만 되어도
      같다고 만들어주고 싶은데 어떤 문장을 건들여야할까요??

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.07.04 19:55 신고

      다음 위치에서 매치된 갯수가 리턴됩니다.

      const int ptsPairs = std::min(GOOD_PTS_MAX, (int)(matches.size() * GOOD_PORTION));

  12. Mct 2019.07.07 18:37

    안녕하세요 매칭 코드를 잘 사용하고 있습니다.
    한가지 질문이 있는데요
    지금의 방식은 스페이스바를 누르고 매칭이 된 후 다른 타겟을 다시 매칭을 하려면 ESC키를 눌러 다시 디버그를 해야했는데요

    스페이스바를 누른 후 매칭을 완료하고 원하는 키를 누르면 초기 디버깅한 환경으로 돌아가면서 다른 타겟을 바로 매칭하고 싶은데 가능할까요??

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.07.07 19:28 신고

      if (key==키asciicode) step=0;을 추가하면 될듯합니다.

    • Mct 2019.07.09 11:50

      정말 감사합니다~!!

  13. abc 2019.07.25 11:38

    1>------ 빌드 시작: 프로젝트: Project3, 구성: Debug x64 ------
    1>main.obj : error LNK2019: "public: static struct cv::Ptr<class cv::xfeatures2d::SURF> __cdecl cv::xfeatures2d::SURF::create(double,int,int,bool,bool)" (?create@SURF@xfeatures2d@cv@@SA?AU?$Ptr@VSURF@xfeatures2d@cv@@@3@NHH_N0@Z) 외부 기호(참조 위치: "public: __cdecl SURFDetector::SURFDetector(double)" (??0SURFDetector@@QEAA@N@Z) 함수)에서 확인하지 못했습니다.
    1>C:\Users\samsung\source\repos\Project3\x64\Debug\Project3.exe : fatal error LNK1120: 1개의 확인할 수 없는 외부 참조입니다.
    1>"Project3.vcxproj" 프로젝트를 빌드했습니다. - 실패
    ========== 빌드: 성공 0, 실패 1, 최신 0, 생략 0 ==========


    제가 무엇을 잘못한걸까요??

  14. 함수r 2019.08.20 19:42

    코드로 구현은 성공했는데 올려주신 동영상과는 다르게 제 컴퓨터에서는 움직이지 않는데,,,컴퓨터 사양문제일수도 있나요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.08.20 19:53 신고

      SURF는 사양에따라 실행되는 속도가 다릅니다.
      다음처럼 바꾸어서 다시 실행해보세요...

      const int LOOP_NUM = 2;

    • 함수r 2019.08.25 16:07

      코드를 수정해도 큰 차이가 없다면 제 컴퓨터에서는 사용 불가능한거겠죠?ㅠ

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

      컴퓨터 사양이 어떻게 되나요?

    • 함수r 2019.08.25 17:08

      5년전에 산 한성노트북이라
      4700mq 램8기가 입니다.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.08.25 19:31 신고

      i3에서도 동작했었기에 컴퓨터 문제는 아닌 듯합니다. 이미지 한장만 비교시 얼마나 시간이 걸리는지 확인해보세요

    • 함수 2019.08.26 17:46

      직접보시는게 빠르실거같아서 유튜브에 올렸는데 확인하시고 바로 지우겠습니다.

      const int LOOP_NUM = 10; 으로되어있는데

      말씀해주신거처럼 2로진행해도 똑같아서 수정하지않고 녹화했습니다.
      https://www.youtube.com/watch?v=Ji10OMihlAo&feature=youtu.be

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.08.26 22:06 신고

      동작안하는게 아니라 느린거네요..

      웹캠 입력 이미지 사이즈를 줄여서 해야할 듯합니다.

  15. ssss0523 2019.10.14 13:22

    영상에서 캡쳐하는게 아닌 특정이미지를 가지고 확인하고싶은데 코딩을 어떤식으로 변형해야할까요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.10.14 14:43 신고

      다음 포스트를 참고하세요..


      OpenCV SURF로 이미지 매칭 테스트
      https://webnautes.tistory.com/1152

    • ssss0523 2019.10.15 22:14

      그 포스트는 봤었습니다! 항상 도움이 되어주셔서 감사합니다. 하지만 제 뜻은 이미지 매칭이 아니고 현재 포스트에서 동영상 캡쳐되는 부분을 그냥 이미지 파일로 이용하고 싶다는 뜻입니다. 캡쳐화면이 아닌 이미지 파일을 이용해 동영상에서 동일한 것을 찾고싶습니다.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.10.15 22:58 신고

      다음 부분이 스페이스바를 누르면 이미지 일부를 잘라서 타겟이미지로 사용하도록 하는 부분입니다. 이 부분에 원하는 이미지를 로드하도록 수정하세요.
      if (key == 32) {
      if (step == 0) {
      img_input(Rect(width / 2 - 150, height / 2 - 150, 300, 300)).copyTo(img_target);
      cvtColor(img_target, img_target_gray, COLOR_BGR2GRAY);

      imshow("target", img_target);
      step++;
      }

  16. 규창 2019.12.30 18:20

    안녕하세요 자료 감사합니다
    잘 작동 합니다. 그런데 발견 포인트는200~400개까지 나오는데 일치 포인트는 33개로 고정되어 있는것 같습니다..
    이미지를 따로 불러와 비교해봤는데 일치하든 하지 않든 포인트가 33개로 고정되어서 나오는데 값이 왜 이럴까요..??

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.12.30 18:41 신고

      good_pts_max값을 늘려보세요

    • 규창 2019.12.31 10:25

      GOOD_PTS_MAX, GOOD_PORTION 두개 값 조정 하니 찾는 일치점은 증가했는데요~혹시 정확도를 올리려면 어찌해야 될까요? 같은 이미지를 인식하면 선이 정확히 매치가 되는데 완전히 다른 이미지를 인식하면 선은 뒤죽박죽되는데 일치점 수는 그대로네용,,

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.12.31 20:08 신고

      good_portion은 원래대로 하는게 어떨까.싶습니다

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.12.31 20:08 신고

      good_portion은 원래대로 하는게 어떨까.싶습니다

    • 규창 2020.01.02 09:37

      good_portion을 바꾸지 않으면 일치 포인트 수가 계속 33에 고정되어 있더라구요...다시해보구 질문드리겠습니다!
      새해 복 많이 받으세용

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.01.02 09:38 신고

      감사합니다..새해복많이 받으세요~

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.01.02 09:50 신고

      ptsPairs 변수값으로 몇개의 포인트를 매치에 사용하는지 결정하는 듯하네요

  17. gg 2020.03.30 21:40

    좋은 자료 감사드립니다~

    코드 실행해본 결과 위 동영상처럼 실시간으로 처리하려면 어느 부분을 수정해야 할까요?
    현재 surf matches 화면이 움직이지 않고 frame 캡쳐된 상태로 움직이지 않습니다. ㅠㅠ

  18. gg 2020.03.30 21:47

    LOOP_NUM를 1로 하였지만 그대로 정지 되어있는 상태입니다..ㅠㅠ

    혹시 다른 이유가 있을까요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.03.30 21:50 신고

      단순한 물체로 해보세요. 너무 많은 키포인트를 잡은게 아닌가 싶네요

  19. gg 2020.03.30 22:09

    답변 감사드립니다.

    특징점이 적은 객체로 했을때도 캡쳐 상태에서 변하지 않습니다.

    코드 분석과 기타 자료를 더 참고해보겠습니다.

    감사합니다.

  20. tkffuwnjdy 2020.07.08 21:28

    위에 있는 코드를 opencv python 에서도 사용 가능한건가요???

+ Recent posts