Алгоритм обнаружения ключевых точек в реальном времени
Мне нужно измерить скорость конвейерной ленты под камерой наблюдения. После многих лет ношения ремень в основном лишен текстуры, даже трудно увидеть, движется ли ремень, если поверх него ничего нет.
Я пытаюсь решить эту проблему как проблему отслеживания объектов:
- Найдите несколько ключевых точек/объектов на поясе.
- Отслеживайте эти ключевые точки/объекты с помощью средства отслеживания среднего потока OpenCV.
- Преобразуйте обратную перспективу и получите скорость в 3D-пространстве.
Если ключевые точки/объекты на шаге 1 задаются вручную, шаги 2 и 3 работают очень хорошо, но у меня есть проблемы с производительностью при автоматическом поиске ключевых точек: обнаружение ключевых точек занимает 60 мс+, даже если я обрезаю изображения до очень маленьких. Я попробовал SURF и ORB, реализованные в OpenCV, ни один из них не является достаточно быстрым.
Есть ли другие более быстрые варианты?
1 ответ
Может быть, вы можете попробовать алгоритм FAST для обнаружения углов. Это быстрее, чем варианты, которые вы пробовали. Это реализовано в opencv. Вот пример кода, извлеченный непосредственно из документации opencv (https://docs.opencv.org/master/df/d0c/tutorial_py_fast.html):
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('simple.jpg',0)
# Initiate FAST object with default values
fast = cv.FastFeatureDetector_create()
# find and draw the keypoints
kp = fast.detect(img,None)
img2 = cv.drawKeypoints(img, kp, None, color=(255,0,0))
# Print all default params
print( "Threshold: {}".format(fast.getThreshold()) )
print( "nonmaxSuppression:{}".format(fast.getNonmaxSuppression()) )
print( "neighborhood: {}".format(fast.getType()) )
print( "Total Keypoints with nonmaxSuppression: {}".format(len(kp)) )
cv.imwrite('fast_true.png',img2)
# Disable nonmaxSuppression
fast.setNonmaxSuppression(0)
kp = fast.detect(img,None)
print( "Total Keypoints without nonmaxSuppression: {}".format(len(kp)) )
img3 = cv.drawKeypoints(img, kp, None, color=(255,0,0))
cv.imwrite('fast_false.png',img3)