如何将字典值与阈值进行比较?

时间:2021-03-29 13:57:42

标签: python dictionary histogram keyframe summarization

我正在研究基于直方图的关键帧提取。我的目标是将阈值与直方图之间的差异进行比较,如果差异大于阈值,则应将其选为关键帧并写入新文件夹中。我的问题是所有的框架都被重新写入了一个新文件夹,尽管大多数框架不满足条件。

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

cap = cv2.VideoCapture("final14.mp4")
frame_list = []
distance = []
try:
    if not os.path.exists('data'):
        os.makedirs('data')
except OSError:
    print("Error cant make directories")

cframe = 0
ret, frame= cap.read()

while ret:
    name = 'data/' + str(cframe) + '.jpg'
    cv2.imwrite(name,frame)
    ret, frame= cap.read()
    print('Read a new frame: ', ret)
    frame_list.append(frame)
    cframe += 1

images = {}
index = {}

for imagePath in glob.glob('data/*.jpg'):
    filename = imagePath[imagePath.rfind("/") + 1:]
                  
    image = cv2.imread(imagePath,1)
    images[filename] = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

    hist = cv2.calcHist([image],[0,1,2],None,[8,8,8],[0,256,0,256,0,256])
    hist = cv2.normalize(hist,None).flatten()
    index[filename] = hist


OPENCV_METHODS = (
    (cv2.HISTCMP_CORREL ),
    (cv2.HISTCMP_CHISQR),
    (cv2.HISTCMP_INTERSECT), 
    (cv2.HISTCMP_BHATTACHARYYA))
 

for method in OPENCV_METHODS:

    results = {}
    reverse = False
 
    if method in (cv2.HISTCMP_CORREL, cv2.HISTCMP_INTERSECT ):
        reverse = True


for (k, hist) in index.items():
        
        d = cv2.compareHist(index[k], hist, cv2.HISTCMP_INTERSECT)
        results[k] = d
        print(d)
       

for (k,hist) in index.items():
            mean__ = np.mean(index[k], dtype=np.float64)

for (k,hist) in index.items():
            variance = np.var(index[k], dtype=np.float64)
            
print("variance", variance)
standard_deviation = np.sqrt(variance)
th = mean__ + standard_deviation + 3
#th = standard_deviation * 8
print("threshold value", th)

try:
    if not os.path.exists('keyframes'):
        os.makedirs('keyframes')
except OSError:
    print("Error cant make directories")

#print(results)
capp = cv2.VideoCapture("final14.mp4")
for k in results.keys():
    success, keyframe = capp.read()
    cframee = 0
    while success:
        if(results[k] > th):
            namee = 'keyframes/' + str(cframee) + '.jpg'
            cv2.imwrite(namee, keyframe)
            success, keyframe = capp.read()
            print("Read new keyframe:", success)
            cframee += 1
        else:
            print("difference smaller than  threshold")

(results) 是一个字典,它有一个图像路径的键和一个差值。我尝试将每个值与阈值进行比较。但是,我的问题没有解决。它仍然写入所有帧而不选择符合条件的帧。

0 个答案:

没有答案