我正在编写代码以从视频中提取帧,并每两个连续帧相减,这样我就会知道图像中的运动实际上在什么位置开始。据我所知,在减去这些帧(如果它们相等)之后,我应该得到一个全零矩阵。为了测试这一点,我在Adobe Premiere Pro上制作了一个视频,该视频的静态图像延长了5秒钟。从视频中提取起始帧后,我将其发送到此函数,但它表明矩阵中存在多个非零元素,这意味着图像是不同的。我很困惑,请帮忙。 附言:图像本身中是否会存储任何元数据,是否由于此原因导致此错误?
这是我用来从图像中提取帧的代码:-
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
答案 0 :(得分:0)
我使用您提供的image_1
文件和该文件的副本而不是image_2
文件对您的代码进行了测试。我收到的像素差异为0,这告诉我代码符合您的预期,但是您要比较的两个图像文件实际上并不相同。您从视频中提取和保存帧的OpenCV代码对我来说看起来不错(尽管在x
命令中不需要while
变量,因为success
标志已经捕获了结束视频),因此我怀疑您描述的视频世代正在发生某些事情。
答案 1 :(得分:0)
当我跳过对初始帧的检查以及从第3帧开始进行检查时,它起作用了。我将j初始化为3。也许在前两个提取的帧中存储了一些额外的元数据,因为即使它们占用的MB量也不同。