6

私はこれを正しい方法で行っているのか、それとももっと効率的な方法があるのか​​ 疑問に思っていました.

ビデオのすべての単一フレームで、この画像がその内部のどこかに含まれている可能性があるように、ビデオ内の画像を探しています(フルサイズのフレームではなく、小さなフレームです)。

現在、ビデオを次のように写真に引き込んでいます。

import cv2
vidcap = cv2.VideoCapture('My_Video.mp4')
success,image = vidcap.read()
count = 0
success = True
while success:
  success,image = vidcap.read()
  print ('Read a new frame: ', success)
  cv2.imwrite("frame%d.jpg" % count, image)     # save frame as JPEG file
  count += 1

次に、それらすべてをそのままループします。

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

img_rgb = cv2.imread('frame1.png')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('small_icon_I_am_looking_for.png',0)
w, h = template.shape[::-1]

res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where( res >= threshold)
for pt in zip(*loc[::-1]):
    cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)

cv2.imwrite('res.png',img_rgb)

おそらく写真の保存をスキップする方法はありますか? 私は何千時間ものビデオでこれを行っており、すべてのフレームを保存して削除すると、必要のない時間がかかる可能性があります. 毎回画像を保存する必要なく、これを検索する方法はありますか? これは私が言いたいことの例です。たとえば、スーパーマリオがプレイされているビデオがあったとします。このコインを探します。

コイン

そしてそれを次のように検出します:

コインが検出されました

これは現在機能していますが、より良い方法を探しているだけです。

4

1 に答える 1