Возможно, вы захотите взглянуть на соответствие функции.Цель состоит в том, чтобы найти элементы в двух изображениях, шаблонное изображение и изображение с шумом и сопоставить их.Это позволило бы вам найти шаблон (логотип) на зашумленном изображении (изображение с камеры).
По сути, функция - это то, что людям было бы интересно на изображении, например, углы или открытое изображение.пространства.Я бы порекомендовал использовать масштабно-инвариантное преобразование объектов (SIFT) в качестве алгоритма обнаружения объектов.Причина, по которой я предлагаю использовать SIFT, заключается в том, что он инвариантен к трансляции, масштабированию и повороту изображения, частично инвариантен к изменениям освещения и устойчив к локальным геометрическим искажениям.Это соответствует вашей спецификации.
![Example of feature detection](https://i.stack.imgur.com/72wFz.png)
Я сгенерировал вышеупомянутое изображение, используя код, измененный из OpenCV docs документов по обнаружению функции SIFT:
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('main.jpg',0) # target Image
# Create the sift object
sift = cv2.xfeatures2d.SIFT_create(700)
# Find keypoints and descriptors directly
kp, des = sift.detectAndCompute(img, None)
# Add the keypoints to the final image
img2 = cv2.drawKeypoints(img, kp, None, (255, 0, 0), 4)
# Show the image
plt.imshow(img2)
plt.show()
При этом вы заметите, что большое количество функций попадает на логотип FedEx (вверху).
Следующее, что я сделал, попытался сопоставить функции из видеопотока с функциями влоготип FedEx.Я сделал это с помощью функции соответствия FLANN.Вы могли бы использовать много подходов (включая грубую силу), но поскольку вы работаете над видео-фидом, это, вероятно, ваш лучший вариант.Приведенный ниже код основан на OpenCV документах о сопоставлении функций:
import numpy as np
import cv2
from matplotlib import pyplot as plt
logo = cv2.imread('logo.jpg', 0) # query Image
img = cv2.imread('main2.jpg',0) # target Image
# Create the sift object
sift = cv2.xfeatures2d.SIFT_create(700)
# Find keypoints and descriptors directly
kp1, des1 = sift.detectAndCompute(img, None)
kp2, des2 = sift.detectAndCompute(logo,None)
# FLANN parameters
FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks=50) # or pass empty dictionary
flann = cv2.FlannBasedMatcher(index_params,search_params)
matches = flann.knnMatch(des1,des2,k=2)
# Need to draw only good matches, so create a mask
matchesMask = [[0,0] for i in range(len(matches))]
# ratio test as per Lowe's paper
for i,(m,n) in enumerate(matches):
if m.distance < 0.7*n.distance:
matchesMask[i]=[1,0]
# Draw lines
draw_params = dict(matchColor = (0,255,0),
singlePointColor = (255,0,0),
matchesMask = matchesMask,
flags = 0)
# Display the matches
img3 = cv2.drawMatchesKnn(img,kp1,logo,kp2,matches,None,**draw_params)
plt.imshow(img3, )
plt.show()
Благодаря этому я смог сопоставить следующие функции, как показано ниже.Вы заметите, что есть выбросы.Однако большинство функций совпадают:
![Logo Matching](https://i.stack.imgur.com/xe6hL.png)
Последним шагом будет просто нарисовать ограничивающую рамку вокруг этого изображения.Я свяжу вас с другим вопросом о переполнении стека , который делает нечто похожее, но с детектором шаров.Вот еще один способ получить ограничивающий прямоугольник, используя OpenCV документы .
Надеюсь, это поможет!