Вычитание изображения на двух копиях одинаковых изображений не дает нулевую матрицу? - PullRequest
0 голосов
/ 03 марта 2019

Я пишу код для извлечения кадров из видео и вычитания каждые два последовательных кадра, чтобы я узнал, с какой позиции фактически начинается движение на изображении.Насколько мне известно, я должен получить матрицу из всех нулей после вычитания этих кадров (если они равны).Чтобы проверить это, я сделал видео на 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

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Это сработало, когда я пропустил проверку начальных кадров и когда я начал проверять с 3-го кадра.Я инициализировал j к 3. Возможно, некоторые дополнительные метаданные хранятся в первых 2 извлеченных кадрах, потому что даже размер занимаемого ими МБ также различен.

0 голосов
/ 03 марта 2019

Я протестировал ваш код, используя предоставленный вами файл image_1 и копию этого файла вместо файла image_2.Я получил 0 различий в пикселях, что говорит мне, что код выполняет то, для чего вы его предназначали, но два файла изображений, которые вы сравниваете, на самом деле не идентичны.Ваш код OpenCV для извлечения и сохранения кадров из видео выглядит для меня нормально (хотя нет необходимости в переменной x в команде while, так как флаг success уже фиксирует конец видео), поэтомуЯ подозреваю, что с созданием видео, которое вы описали, что-то происходит.

...