Есть ли способ найти отдельные кадры в видео, чтобы обеспечить минимальное перекрытие пикселей/ключевых точек?

#python #opencv #image-processing #video-processing #cv2

Вопрос:

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

 import sys
import cv2
import numpy as np
from google.colab.patches import cv2_imshow
img1 = cv2.imread("/content/drive/MyDrive/lefttom.JPG")
img2 = cv2.imread("/content/drive/MyDrive/righttom.JPG")
img1_gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
img2_gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

orb = cv2.ORB_create(nfeatures=100)

keypoints1, descriptors1 = orb.detectAndCompute(img1, None)
keypoints2, descriptors2 = orb.detectAndCompute(img2, None)

bf = cv2.BFMatcher_create(cv2.NORM_HAMMING)

matches = bf.knnMatch(descriptors1, descriptors2,k=2)

def draw_matches(img1, keypoints1, img2, keypoints2, matches):
  r, c = img1.shape[:2]
  r1, c1 = img2.shape[:2]

  output_img = np.zeros((max([r, r1]), c c1, 3), dtype='uint8')
  output_img[:r, :c, :] = np.dstack([img1, img1, img1])
  output_img[:r1, c:c c1, :] = np.dstack([img2, img2, img2])

  for match in matches:
    img1_idx = match.queryIdx
    img2_idx = match.trainIdx
    (x1, y1) = keypoints1[img1_idx].pt
    (x2, y2) = keypoints2[img2_idx].pt

    cv2.circle(output_img, (int(x1),int(y1)), 4, (0, 255, 255), 1)
    cv2.circle(output_img, (int(x2) c,int(y2)), 4, (0, 255, 255), 1)
    cv2.line(output_img, (int(x1),int(y1)), (int(x2) c,int(y2)), (0, 255, 255), 1)    
    
  return output_img
 

введите описание изображения здесь
введите описание изображения здесь
введите описание изображения здесь
введите описание изображения здесь
введите описание изображения здесь

Комментарии:

1. Я не знаю, сработает ли это для ваших изображений… Вы можете попробовать: найти гомографию, исказить одно изображение и вычесть из другого (вычислить сумму абсолютной разницы или сумму квадратов разницы). Поищите примеры выравнивания изображений OpenCV. В случае, если вы хотите увеличить свои шансы получить ответ, я рекомендую вам публиковать больше «чистых» образцов изображений (без маркеров) и описывать ожидаемые результаты. (также: добавьте тег opencv)