import cv2
|
from skimage.metrics import structural_similarity as ssim
|
import numpy as np
|
|
class VideoSSIM:
|
def __init__(self, video_path):
|
# 初始化视频路径和打开视频
|
self.video_path = video_path
|
self.cap = cv2.VideoCapture(video_path)
|
if not self.cap.isOpened():
|
raise ValueError(f"Error opening video file: {video_path}")
|
|
# 获取视频帧率(fps)
|
self.fps = self.cap.get(cv2.CAP_PROP_FPS)
|
|
# 获取视频的尺寸
|
self.frame_width = int(self.cap.get(cv2.CAP_PROP_FRAME_WIDTH))
|
self.frame_height = int(self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
|
|
def calculate_ssim(self):
|
# 读取视频的第一帧
|
ret, prev_frame = self.cap.read()
|
if not ret:
|
raise ValueError("Error reading the first frame")
|
|
prev_frame_gray = cv2.cvtColor(prev_frame, cv2.COLOR_BGR2GRAY) # 转换为灰度图
|
|
# 存储相似性数值
|
ssim_values = []
|
|
# 从第二帧开始逐帧计算与前一帧的结构相似性
|
frame_index = 2 # 从第二帧开始
|
while True:
|
ret, curr_frame = self.cap.read()
|
if not ret:
|
break
|
|
# 转换当前帧为灰度图
|
curr_frame_gray = cv2.cvtColor(curr_frame, cv2.COLOR_BGR2GRAY)
|
|
# 计算SSIM
|
ssim_value, _ = ssim(prev_frame_gray, curr_frame_gray, full=True)
|
ssim_values.append((frame_index, ssim_value)) # 记录帧索引和SSIM值
|
|
# 更新前一帧
|
prev_frame_gray = curr_frame_gray
|
frame_index += 1
|
|
# 释放视频捕捉对象
|
self.cap.release()
|
|
return ssim_values
|
|
def save_ssim_to_file(self, output_file="ssim_values.txt"):
|
ssim_values = self.calculate_ssim()
|
|
# 保存SSIM值到文件
|
with open(output_file, "w") as f:
|
for frame_idx, ssim_value in ssim_values:
|
f.write(f"Frame {frame_idx}: SSIM = {ssim_value}\n")
|
|
print(f"SSIM values saved to {output_file}")
|
|
# 使用示例
|
video_ssim = VideoSSIM("demo.mp4") # 替换成你的视频文件路径
|
video_ssim.save_ssim_to_file("demo_ssim_output.txt")
|