wangzhibo
2024-12-04 4c5a1f2f09f6906bf26a783d2fa345a5886a2335
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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")