首页 > 解决方案 > 如何在水平视频中找到不同的帧,使它们没有重叠?

问题描述

我有一个像这个 YouTube 视频这样的水平视频。我的目标是在类似的视频中执行对象检测和计数。因此,我想从中获取帧,以便它们之间没有任何/太多重叠像素(并且我可以将这些帧传递给我的对象检测逻辑)。

我遇到了一种可以在图像中找到某些关键点的方法,但是有没有办法跨两帧识别这些关键点?我的想法是查看 2 帧是否有任何共同的关键点,如果没有,则将它们视为不同的。

任何其他方法也值得赞赏!

识别 2 个图像中的关键点并使用蛮力匹配它们的代码(在我的情况下不起作用):

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

所需的样本输出:

在此处输入图像描述 在此处输入图像描述

标签: pythonopencvimage-processingvideo-processing

解决方案


推荐阅读