개발/Computer Vision

[OpenCV] goodFeaturesToTrack 함수를 이용해 코너의 특징점 추출

hojak99 2016. 10. 16. 01:11

실질적으로 사용한 함수는 goodFeaturesToTrack 함수가 아닌 cvGoodFeaturesToTrack 함수를 사용했다. 


쉽게 말해서 최신 버전의 함수를 사용한 것이 아니라 옛날 버전의 함수를 사용했는데 그 이유가 있다..


최신 버전에서의 함수는 왜 그런지 자꾸 오류를 뿜어댔고 std::vector<cv::Point2f로 선언한 변수를 outputArray에 놓았을 경우 그 값이 18446743821561047315 가 나오는 폐단이 발생했다....



3일 동안의 삽질을 통해서 얻을 수 있는 교훈은 최신 버전에서 안 될 경우 구 버전에서 사용해 보자 는 것이다.


구 버전의 함수들만을 이용해 코딩을 해야하는데 최신 버전보다 코딩하기 까다롭다.....



[그림 1: 코너 특징점 검출]



[그림 1]에서 코너의 검출을 저정도 밖에 하지 못한 이유는 내가 num을 500으로 잡아서 그렇다.

500보다 크게 하면 더 많이, 적게 하면 더 적게 검출한다.



#include <opencv2\opencv.hpp>


int main()

{


IplImage *tmpImage = cvLoadImage("sample.png", CV_LOAD_IMAGE_GRAYSCALE);


CvPoint2D32f *corners = new CvPoint2D32f;



cv::Mat mask;

IplImage *gray;

int num = 500;


cvGoodFeaturesToTrack(tmpImage, NULL, NULL, corners, &num, 0.1,5);


for (long i = 0; i <num; i++) {

cvCircle(tmpImage, cvPointFrom32f(corners[i]), 3, CV_RGB(0, 0, 255), 2);

}


cvNamedWindow("image", CV_WINDOW_AUTOSIZE);

cvShowImage("image", tmpImage);


cv::waitKey(0);


cvDestroyAllWindows();

cvReleaseImage(&tmpImage);


return 0;

}








최신 버전? 의 함수를 사용한 코드이다.



#include <opencv2\opencv.hpp>

int main()
{
cv::Mat tmpImage = cv::imread("sample.png");
std::vector<cv::Point2f> corner;


cv::Mat mask = tmpImage.clone();
cv::Mat gray;

cv::cvtColor(mask, gray, CV_BGR2GRAY);

cv::goodFeaturesToTrack(gray, corner, 500, 0.1, 5.0, cv::Mat(), 3, false, 0.04);

std::cout << corner.size() << std::endl;
//출력값 : 18446743821561047315
//왜 이런 것일까요

for (size_t i = 0; i <corner.size(); i++) {
cv::circle(mask, corner[i], 5, cv::Scalar(255, 255, 0));
}

cv::namedWindow("image", CV_WINDOW_AUTOSIZE);
cv::imshow("image", mask);

cv::waitKey(0);

return 0;
}




반응형