Computer Vision

[Keypoint Detector] Dense

Xin chào, trong bài viết này chúng ta sẽ tìm hiểu về Dense Keypoint Detector – một detector cực kỳ đơn giản được sử dụng chủ yếu với các bức ảnh tự nhiên, khi mà các tiêu chuẩn để xác định “corner”, “blob” không còn hiệu quả.


TÌM HIỂU VỀ DENSE KEYPOINT DETECTOR

Với Dense Detector, mỗi pixel đều có thể trở thành keypoint.

dense1
Hình 1 – Đánh dấu mỗi 25 pixel là một keypoint
dense2
Hình 2 – Đánh dấu mỗi 15 pixel là một keypoint

Sự thật là chẳng có giải thuật nào phía sau Dense Detector. Trong một số trường hợp, đơn giản chỉ đánh dấu các pixel trong bức ảnh là keypoint cũng cho kết quả tốt hơn các kỹ thuật khác, đặc biệt đối với các bức ảnh tự nhiên.

Để cải thiện tính bất biến với tỉ lệ (scale invariant), chúng ta sẽ áp dụng Dense với kích thước keypoint thay đổi.

dense3
Hình 3 – Keypoint với kích thước thay đổi

Dense có nhược điểm là tiêu tốn nhiều bộ nhớ để lưu trữ các keypoint. Ví dụ, cho một bức ảnh 640×480, chúng ta đánh dấu mỗi 20 pixel là một keypoint, tổng cộng chúng ta nhận được 32×24=768 keypoints. Chính vì tiêu tốn nhiều bộ nhớ và thời gian xử lý khi số lượng keypoint tăng cao nên Dense Detector không phù hợp các ứng dụng thời gian thực.


ÁP DỤNG DENSE KEYPOINT DETECTOR

Vì thuật toán quá đơn giản nên OpenCV 3 không cung cấp function cho Dense detector. Do đó chúng ta sẽ tự viết function.

Source code: Dense.py

import numpy as np
import cv2
import argparse

def dense(image, step, radius):
    kps = []

    for x in range(0, image.shape[1], step):
        for y in range(0, image.shape[0], step):
            kps.append(cv2.KeyPoint(x,y,radius*2))
    return kps

ap = argparse.ArgumentParser()
ap.add_argument("-s", "--step", type=int, default=50)
args = vars(ap.parse_args())

image = cv2.imread("forest.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

kps = []
radii = (4,8,12)
rawkps = dense(gray, args["step"], 1)

for kp in rawkps:
    for r in radii:
        kps.append(cv2.KeyPoint(kp.pt[0], kp.pt[1], r*2))

print("# dense keypoints: {}".format(len(rawkps)))
print("# dense + multi radii keypoints: {}".format(len(kps)))

for kp in kps:
    r = int(0.5*kp.size)
    (x,y) = np.int0(kp.pt)
    cv2.circle(image, (x,y), r, (0,255,255), 1)

cv2.imshow("Image",image)
cv2.waitKey(0)

Input: forest.jpg
forest

Execution:
$ python Dense.py -s 50

Output:
output


SUMMARY

Như vậy chúng ta đã tìm hiểu về Dense Keypoint Detector và cách áp dụng nó. Cảm ơn các bạn đã theo dõi bài viết.

Thân ái và quyết thắng.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s