Я пишу код для извлечения кадров из видео и вычитания каждые два последовательных кадра, чтобы я узнал, с какой позиции фактически начинается движение на изображении.Насколько мне известно, я должен получить матрицу из всех нулей после вычитания этих кадров (если они равны).Чтобы проверить это, я сделал видео на Adobe Premiere Pro, в котором статичное изображение было увеличено на 5 секунд.После извлечения начальных кадров из видео я отправил их этой функции, но она показывает, что в матрице есть несколько ненулевых элементов, что означает, что изображения отличаются.Я в замешательстве, пожалуйста, помогите.PS: будут ли какие-либо метаданные, которые хранятся в самих изображениях, и связана ли эта ошибка с этим?
Этот код, который я использую для извлечения кадров из изображений: -
enter code here
import cv2
import math
videoname = "mod_vdo.mp4"
imagesloc = "C:\\Users\\ANJANIPRASAD\\PycharmProjects\\Sin\\frames1"
vdoobject = cv2.VideoCapture(videoname)
fr = vdoobject.get(5) #gets the frame rate of the video
print(fr)
success = 1
frameCount = vdoobject.get(cv2.CAP_PROP_FRAME_COUNT)
frc=math.floor(fr)
duration=math.floor(frameCount/fr)
print(duration)
x=1
while x<=duration and success:
# vidObj object calls read
# function extract frames
frameId = vdoobject.get(1)
success, image = vdoobject.read()
if (frameId % frc == 0): #if fr is 24fps, 24rth, 48th, 72 etc will be extracted one by one
filename = imagesloc + "/image_" + str(int(x)) + ".jpg";x=x+1
cv2.imwrite(filename, image)
vdoobject.release()
print("Done!")
Это извлекает один кадр каждую секунду (точнее, последний кадр каждой секунды)
Это код, который я использую для сравнения кадров:
import cv2
import os
import numpy as np
from keras.preprocessing import image
dir="C:\\Users\\ANJANIPRASAD\\PycharmProjects\\Sin\\frames1"
j=1
for filename in os.listdir(dir):
if filename.endswith('.jpg'):
im1 = cv2.imread(dir + '/image_'+str(j)+'.jpg')
im2= cv2.imread(dir+'/image_'+str(j+1)+'.jpg')
if im1.shape==im2.shape:
diff=cv2.subtract(im1,im2)
b,g,r=cv2.split(diff)
if cv2.countNonZero(b)==0 and cv2.countNonZero(g)==0 and
cv2.countNonZero(r)==0:
j=j+1
continue
else:
print('Start from the frame '+str(j)+' as the consecutive frames
are different')
break
Яполучая что 287829 разных пикселей между этими изображениями.Вот изображения: https://drive.google.com/open?id=1t14fpcQImVldIrxW0C1Zvz3MWMliDWUr