-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdiffm.py
141 lines (117 loc) · 3.8 KB
/
diffm.py
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
import cv2
import sys
import os
import numpy as np
import time
import matplotlib.pyplot as plt
# 引数を取得
args = sys.argv
# 変数の初期化/未定義エラーを防ぐ
mov_A = ""
mov_B = ""
interval = 0
threshold = -1
# 引数から動画を指定
if (len(args) <= 2):
exit("引数を2つ以上指定してください")
if (len(args) > 2):
# 第1引数で 動画A 指定
mov_A = args[1]
# 第2引数で 動画B 指定
mov_B = args[2]
# 第3引数でinterval指定
if (len(args) > 3):
interval = int(args[3])
if (len(args) > 4):
threshold = float(args[4])
# 0~255以外の値が指定されたときはエラーを出す
if not(0 <= threshold <= 255):
exit("thresholdは0~255の値を指定してください")
# 引数指定が多すぎるときはエラーを出す
if (len(args) > 5):
exit("引数が多すぎます")
# 動画A/Bのパスを表示
print("比較動画A: ", mov_A)
print("比較動画B: ", mov_B)
# 描画間隔を表示
print("描画間隔(フレーム): ", end="")
if interval <= 0:
interval = 30
print(interval)
# 閾値を表示
print("閾値: ", end="")
if (threshold == -1):
print("設定なし", "\n")
else:
print(threshold, "\n")
# overフォルダがなければ作成
os.makedirs("over", exist_ok=True)
# overフォルダ内にファイルが残っていれば削除するか確認
over_len = len(os.listdir("over"))
if ((over_len) > 0):
print("overフォルダに" + str(over_len) + "ファイル残っています。")
exit("中身を削除してから再実行してください。")
# 動画の読み込み
video1 = cv2.VideoCapture(mov_A)
video2 = cv2.VideoCapture(mov_B)
brightness = []
# 開始秒数
startTime = time.time()
# フレーム番号
i = 1
# 差分の最大値
diff_max = 0
# 区間内の最大値
interval_max_brightness = 0
while (True):
# 動画の1フレームを取得
ret1, frame1 = video1.read()
ret2, frame2 = video2.read()
# どちらかのフレームが取得できない場合はループを抜ける
if not ret1 or not ret2:
break
# フレームの差分で画像を作成
diff = cv2.absdiff(frame1, frame2)
# BGR(RGB)からHSVに変換
diff_hsv = cv2.cvtColor(diff, cv2.COLOR_BGR2HSV)
# HSVのV(明度)だけ抽出
diff_v = diff_hsv[:, :, 2]
# 平均値を計算
diff_v_mean = np.mean(diff_v)
# 配列に追加
brightness.append(diff_v_mean)
# 最大値を更新
if (interval_max_brightness < diff_v_mean):
interval_max_brightness = diff_v_mean
diff_max = diff
# 描画間隔ごとに更新
if (i % interval == 0):
# グラフをクリアして描画
plt.cla()
plt.plot(brightness)
# グラフのラベルを設定
plt.xlabel("frame")
plt.ylabel("brightness")
plt.ylim(0, 255)
plt.pause(0.0001)
# 画像を表示
cv2.imshow('diffm', diff_max)
cv2.waitKey(1)
threshold_over = ""
# 閾値が指定されているときは閾値と比較
if (threshold != -1 and interval_max_brightness > threshold):
threshold_over = "*"
# 画像を保存
cv2.imwrite("over/diffm_" + str(i) + ".png", diff_max)
# フレーム番号と区間内の最大値を表示
print("frame: < " + str(i) + " | " + "brightness: " + str(interval_max_brightness), str(threshold_over))
# diffの初期化
diff_max = diff # 初期化は現在のフレームを使う(エラーを防ぐ)
interval_max_brightness = 0
i += 1
# 実行にどれくらいかかったか
print("time: ", (time.time() - startTime), "[sec]")
cv2.waitKey(0)
# メモリ解放
video1.release()
video2.release()