Визуализация OpenCV KeyPoints

Я изучаю OpenCV и в данный момент пытаюсь понять основные данные, хранящиеся в KeyPoint чтобы я мог лучше использовать эти данные для приложения, над которым я работаю.

До сих пор я просматривал эти две страницы:

http://docs.opencv.org/modules/features2d/doc/common_interfaces_of_feature_detectors.html?highlight=featuredetector

http://docs.opencv.org/doc/tutorials/features2d/feature_detection/feature_detection.html

Когда я следую учебнику, однако, используя drawKeypoints()точки имеют одинаковый размер и форму и нарисованы, казалось бы, произвольным цветом.

Я думаю, я мог бы пройтись по атрибутам для каждой ключевой точки: нарисовать круг, нарисовать стрелку (для угла), дать ему цвет, основанный на ответе и т. Д. Но я подумал, что должен быть лучший способ.

Есть ли встроенный метод или другой подход, аналогичный drawKeypoints() что поможет мне более эффективно визуализировать KeyPoints изображения?

2 ответа

Решение

Да, есть способ выполнить вашу задачу. Как сказано в документации

Для каждой ключевой точки будет нарисован круг вокруг ключевой точки с размером и ориентацией ключевой точки.

Если вы используете Java, вы можете просто указать тип ключевых точек:

Features2d.drawKeypoints(image1, keypoints1, imageOut2,new Scalar(2,254,255),Features2d.DRAW_RICH_KEYPOINTS);

В C++:

drawKeypoints( img_1, keypoints_1, img_keypoints_1, Scalar::all(-1), DrawMatchesFlags::DRAW_RICH_KEYPOINTS );

У меня была аналогичная проблема, и я хотел настроить нарисованные точки, решил поделиться своим решением, потому что я хотел изменить форму нарисованных точек.

Вы можете изменить строку с помощью cv2.circle на то, что хотите. im - это входное изображение, на котором вы хотите нарисовать точки, keyp - это ключевые точки, которые вы хотите нарисовать, col - цвет линии, th - толщина края круга.

import cv2
import numpy as np
import matplotlib.pyplot as plt

def drawKeyPts(im,keyp,col,th):
    for curKey in keyp:
        x=np.int(curKey.pt[0])
        y=np.int(curKey.pt[1])
        size = np.int(curKey.size)
        cv2.circle(im,(x,y),size, col,thickness=th, lineType=8, shift=0) 
    plt.imshow(im)    
    return im    

imWithCircles = drawKeyPts(origIm.copy(),keypoints,(0,255,0),5)

Вы можете перебирать вектор ключевых точек, которые вы обнаруживаете, и рисовать (например) окружность на каждом KeyPoint.pt, имеющую радиус, аналогичный KeyPoint.size, и цвет по отношению к KeyPoint.response. Это, конечно, только пример; Вы могли бы написать более сложные функции рисования, основанные на октаве и угле KeyPoint (если ваш детектор дает этот вывод)..

Надеюсь это поможет.

Привет , это мой код @Alex

def drawKeyPts(im, keyp, col, th):
    draw_shift_bits = 4
    draw_multiplier = 1 << 4
    LINE_AA = 16
    im = cv2.cvtColor(im, cv2.COLOR_GRAY2BGR)
    for curKey in keyp:
        center = (int(np.round(curKey.pt[0]*draw_multiplier)), int(np.round(curKey.pt[1]*draw_multiplier)))
        radius = int(np.round(curKey.size/2*draw_multiplier))
        cv2.circle(im, center, radius, col, thickness=th, lineType=LINE_AA, shift=draw_shift_bits)
        if(curKey.angle != -1):
            srcAngleRad = (curKey.angle * np.pi/180.0)
            orient = (int(np.round(np.cos(srcAngleRad)*radius)), int(np.round(np.sin(srcAngleRad)*radius)))
            cv2.line(im, center, (center[0]+orient[0], center[1]+orient[1]), col, 1, LINE_AA, draw_shift_bits)
    cv2.imshow('name1', im)
    cv2.waitKey()
    return im
Другие вопросы по тегам