ORB::create() 멤버 함수는 ORB 특징점 검출 및 기술자 계산에 필요한 많은 인자를 가지고 있지만 모두 기본값을 가지고 있습니다. 그러므로 기본 설정을 이용하여 ORB 클래스 객체를 생성하려면 다음과 같이 코드를 작성합니다.
Ptr<ORB> feature = ORB::create();
앞 예제 코드에서 사용된 Ptr 클래스는 OpenCV에서 사용하는 스마트 포인터(smart pointer) 클래스입니다.6 그러므로 이 예제 코드에서 변수 feature는 마치 ORB 객체의 포인터처럼 사용할 수 있고, 동적으로 할당된 ORB 객체의 메모리는 자동으로 해제됩니다.
그런데 ORB 클래스가 Feature2D 클래스를 상속받아 만들어진 클래스이기 때문에 앞 예제 코드는 다음과 같이 바꿔 쓸 수 있습니다.
Ptr<Feature2D> feature = ORB::create();
이와 같은 코드 작성 방법은 Feature2D 클래스를 상속받아 만들어진 특징점 클래스에 대해 공통으로 사용할 수 있습니다. 예를 들어 ORB 특징점 대신 KAZE 특징점 검출 방법을 사용하고 싶다면 앞 예제 코드에서 ORB::create() 대신 KAZE::create()로만 변경하면 됩니다.
일단 특징점 클래스 객체를 생성하였다면 이제 영상에서 특징점을 검출하거나 검출된 특징점을 표현하는 기술자를 계산할 수 있습니다. 먼저 특징점을 검출할 때에는 Feature2D::detect() 가상 멤버 함수를 사용합니다. Feature2D::detect() 함수 원형은 다음과 같습니다.
virtual void Feature2D::detect(InputArray image, std::vector<KeyPoint>& keypoints, InputArray mask = noArray()); |
|
• image |
입력 영상 |
• keypoints |
검출된 키포인트 정보 |
• mask |
마스크 행렬. 마스크 행렬 원소가 0이 아닌 위치에서만 특징점을 검출합니다. |
6 원래 OpenCV는 자체적인 스마트 포인터를 cv::Ptr 클래스로 구현하여 사용하였지만, OpenCV 4.0.0 버전부터는 C++의 std::shared_ptr 클래스가 Ptr 클래스 기능을 대체하고 있습니다. 그러므로 cv::Ptr 클래스 사용법은 std::shared_ptr과 비슷합니다. 스마트 포인터와 std::shared_ptr 클래스에 대해서는 C++ 문법책을 참고하기 바랍니다.