Các giải thuật tìm Keypoints và Keypoint descriptors

Một phần của tài liệu nghiên cứu thư viện opencv ứng dụng trong việc nhận dạng biển báo giao thông (Trang 46 - 50)

CHƯƠNG 2: CƠ SỞ LÝ THUYẾT

2.4. Lý thuyết xử lý ảnh và các hàm hỗ trợ bởi OpenCV

2.4.4. Các giải thuật tìm Keypoints và Keypoint descriptors

Keypoints là điểm điểm quan trọng như các góc (corners) là điểm giao nhau giữa 2 edges, gradient của hình theo cả hai hướng có sự biến đổi lớn.

Keypoint descriptors là tập hợp các điểm lân cận các keypoints, nhằm mục đích mô tả các keypoints.

Dưới đây tôi sẽ trình bày các hàm tìm KeyPoint và KeyPoint descriptor trong OpenCV mà không đi sâu vào cách cài đặt của các giải thuật.

Hình 2.12: Walk sign dectection

KeyPoint

Class đại diện cho một điểm nổi bật, chứa thông tin về toạ độ điểm, hướng (góc – theo chiều kim đồng hồ) và một vài thông tin khác.

struct KeyPoint {

// coordinates of the keypoints Point2f pt;

// computed orientation of the keypoint (-1 if not applicable) float angle;

};

FeatureDetector

Các giải thuật tìm kiếm keypoints được bao bọc (wrapper) nhiều interface nhằm giúp dễ dàng cho việc chuyển đổi các giải thuật khác nhau để giải quyết cùng một vấn đề.

Tất cả các class cài đặt giải thuật keypoint detector đều thừa kế FeatureDetector interface.

class FeatureDetector : public virtual Algorithm

FeatureDetector::detect

Tìm keypoints trong một hình ảnh hoặc một tập hình ảnh.

void FeatureDetector::detect(const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask = Mat()) const

void FeatureDetector::detect(const vector<Mat>& images, vector<vector<KeyPoint>>& keypoints, const vector<Mat>& masks = vector<Mat>()) const

Trong đó,

• image – Hình ảnh nguồn

• images – Tập hình ảnh nguồn

• keypoints – Tập KeyPoint được tìm thấy; trong trường hợp thứ 2 keypoint[i] là tập KeyPoint được tìm thấy của images[i]

• mask – Mặt nạ điều khiển vùng nào trong image sẽ được tìm keypoint. Phải là ma trận 8-bit với giá trị khác không (non-zero) cho vùng cần tìm keypoint

• masks – Vector mặt nạ như mask

Các classes cài đặt giải thuật tìm kiếm keypoints như FastFeatureDetector,

SurfFeatureDetector, SiftFeatureDetector, BriskFeatureDetector,...

DescriptorExtractor

Các giải thuật trích xuất descriptors được bao bọc (wrapper) nhiều interface nhằm giúp dễ dàng cho việc chuyển đổi các giải thuật khác nhau để giải quyết cùng một vấn đề.

Tất cả các class cài đặt giải thuật descriptor extractor đều thừa kế DescriptorExtractor

interface.

class DescriptorExtractor : public virtual Algorithm

DescriptorExtractor::compute

Trích xuất descriptors của keypoints của một hình ảnh hoặc tập hình ảnh.

void DescriptorExtractor::compute(const Mat& image, vector<KeyPoint>& keypoints, Mat& descriptors) const

void DescriptorExtractor::compute(const vector<Mat>& images, vector<vector<KeyPoint>>& keypoints, vector<Mat>& descriptors) const

Trong đó,

• image – Hình ảnh nguồn

• images – Tập hình ảnh nguồn

• keypoints – Tập keypoints nguồn; trong trường hợp thứ 2 keypoint[i] là tập KeyPoint được tìm thấy của images[i]

• descriptors – Descriptor của tập keypoints được tính toán; trong trường hợp thứ 2

descriptors[i] là descriptor của images[i]

Các classes cài đặt giải thuật trích xuất descriptors như SiftDescriptorExtractor,

SurfDescriptorExtractor, BriefDescriptorExtractor, BriskDescriptorExtractor,...

SURF

Class cài đặt giải thuật SURF (Speeded-Up Robust Features) tìm kiếm keypoints và tính toán descriptors. (Đã được cấp bằng sáng chế, thận trọng trong các ứng dụng thương mại).

Các phương thức khởi tạo:

SURF::SURF()

SURF::SURF(double hessianThreshold, int nOctaves = 4, int nOctaveLayers = 2, bool extended = true, bool upright = false)

Trong đó,

• hessianThreshold – Giá trị ngưỡng mà các keypoints sẽ được giữ lại nếu hession lớn hơn; giá trị được khuyên dùng từ 300 – 500

• nOctaves – Số lượng gaussian pyramid octave mà keypoint detector sử dụng

• nOctaveLayers – Số lượng hình ảnh trong mỗi octave của gaussian pyramid

• extended – Nếu giá trị là false sẽ dùng 64 phần tử descriptors, ngược lại sử dụng 128 phần tử descriptors

• upright – Nếu giá trị là false sẽ không tính toán hướng của keypoint và ngược lại

SIFT

Class cài đặt giải thuật SIFT (Scale Invariant Feature Transform) tìm kiếm keypoints và tính toán descriptors. (Đã được cấp bằng sáng chế, thận trọng trong các ứng dụng thương mại).

Phương thức khởi tạo:

SIFT::SIFT(int nfeatures = 0, int nOctaveLayers = 3, double contrastThreshold = 0.04, double edgeThreshold = 10, double sigma = 1.6)

Trong đó,

• nfeatures – Số keypoints số đa sẽ tìm kiếm

• nOctaveLayers – Số lượng hình ảnh trong mỗi octave của gaussian pyrami

• contrastThreshold – Giá trị ngưỡng cho độ tương phản dung để loại bỏ những keypoint không chất lượng

• edgeThreshold – Kích thước đường biên không tìm kiếm keypoints

• sigma – Giá trị sigma sử dụng trong Gaussian áp dụng cho hình ảnh nguồn ở tầng octave thứ 0

ORB

Class cài đặt giải thuật ORB tìm kiếm keypoints và tính toán descriptors. Là sự kiết hợp giữa FastFeatureDetector và BriefDescriptorExtractor.

Phương thức khởi tạo:

ORB(int nfeatures = 500, float scaleFactor = 1.2f, int nlevels = 8, int edgeThreshold = 31, int firstLevel = 0, int WTA_K = 2, int scoreType = ORB::HARRIS_SCORE, int patchSize = 31);

Trong đó,

• nfeatures – Số keypoints số đa sẽ tìm kiếm

• scaleFactor – Tỷ lệ piramid, lớn hơn 1.

• nlevels – Số cấp pyramid

• edgeThreshold – Kích thước đường biên không tìm kiếm keypoints

• firstLevel – Hiện tại chỉ hỗ trợ giá trị 0

• WTA_K – Số lượng điểm để tạo nên một phần tử oriented BRIEF descriptor, các giá trị có thể là 2, 3, 4 tương ứng với chọn ngẫu nhiên 2, 3, 4 điểm để tính toán

• scoreType – Kiểu xếp hạng keypoints để giữ lại số lượng nfeatures keypoints

ORB::HARRIS_SCORE: Sử dụng giải thuật Harris để xếp hạng

ORB::FAST_SCORE: Nhanh hơn so với giá trị ở trên, nhưng ít keypoint stable

• patchSize – Kích thước patch được sử dụng trong BRISK descriptor

SURF::operator(), SIFT::operator(), ORB::operator()

Tìm tất cả keypoints và tính toán descriptors của các keypoints đó.

void operator()(InputArray image, InputArray mask, vector<KeyPoint>& keypoints, OutputArray descriptors, bool useProvidedKeypoints = false) const;

Trong đó,

• image – Hình ảnh nguồn

• mask – Mặt nạ điều khiển vùng cần tìm keypoints và tính descriptors, nếu không sử mặt nạ thì truyền vào giá trị cv::noArray()

• keypoints – Kết quả tìm keypoints

• descriptors – Kết quả tính descriptors

• useProvidedKeypoints – Nếu giá trị là true, thì vector keypoint chỉ dùng để tính toán descriptors, khi hàm trả về kết quả keypoints không có giá trị

Ví dụ 2.13: Tìm keypoints và tính descriptors của một hình ảnh bằng giải thuật ORB

#include "opencv2/opencv.hpp"

using namespace cv;

Mat colorQueryImage, grayQueryImage, queryDescriptors;

vector<KeyPoint> queryKeyPoints;

int main(int argc, char const* argv[]) {

colorQueryImage = imread(argv[1], IMREAD_COLOR);

cvtColor(colorQueryImage, grayQueryImage, COLOR_BGR2GRAY);

int nfeatures = 500; float scaleFactor = 1.2f;

int nlevels = 8; int edgeThreshold = 5;

int firstLevel = 0; int WTA_K = 2;

int scoreType = ORB::FAST_SCORE; int patchSize = 31;

ORB orb(nfeatures, scaleFactor, nlevels, edgeThreshold, firstLevel, WTA_K, scoreType, patchSize);

orb(grayQueryImage, noArray(), queryKeyPoints, queryDescriptors, false);

std::cout << "Num of Keypoints: " << queryKeyPoints.size() << std::endl;

std::cout << "Dim of Descriptors: " << queryDescriptors.size() << std::endl;

return 0;

}

Một phần của tài liệu nghiên cứu thư viện opencv ứng dụng trong việc nhận dạng biển báo giao thông (Trang 46 - 50)

Tải bản đầy đủ (PDF)

(65 trang)