2024-06-02 05:10:08 发布
网友
我有视频文件,我可以转换成RGB空间cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)为每一帧
cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
然后我想计算红色和蓝色颜色值的平均值和标准偏差,在100秒的时间内求平均值和标准偏差。我的视频是>;100秒长,因此希望每100秒重复一次,并将值分配给向量。 因此,对于每100秒的剪辑,我有值R(ave),R(sd),B(ave),B(sd)
我是相当新的简历和视频处理,所以将感谢在这方面的任何帮助
我终于写了。整个程序将在超过1分钟的视频上运行足够长的时间。如果你的电脑很弱,那么我并不羡慕你。但总的来说,它工作得很好。这是:
import cv2 def calc_sd(arr: list, mean_val: float): prev_dis = 0 for k in arr: prev_dis += (k - mean_val) ** 2 dis = prev_dis / len(arr) return dis ** (1 / 2) def calc_mean(arr: list): return sum(arr) / len(arr) # list of your videos here lst_of_videos = ['vid_test.mkv', 'signs.mkv', 'signs_ml.mkv'] lst_of_all_videos_data = [] for i in lst_of_videos: cap = cv2.VideoCapture(i) # list for data every 100 sec # data there will be like: # [['mean_red', 'mean_green', 'mean_blue', 'sd_red', 'sd_green', 'sd_blue'], 'and every 100 sec like this'] lst_of_data = [] lst_of_red = [] lst_of_green = [] lst_of_blue = [] # getting video fps fps = cap.get(cv2.CAP_PROP_FPS) abstract_seconds = 0 # for counting frames print('video: ', i) while True: ret, frame = cap.read() if abstract_seconds >= 100 or not ret: print(' video: ', i, ', 100 secs, ret: ', ret) mean_red = calc_mean(lst_of_red) mean_green = calc_mean(lst_of_green) mean_blue = calc_mean(lst_of_blue) print(' mean counted') sd_red = calc_sd(lst_of_red, mean_red) sd_green = calc_sd(lst_of_green, mean_green) sd_blue = calc_sd(lst_of_blue, mean_blue) print(' sd counted') lst_of_data.append([mean_red, mean_green, mean_blue, sd_red, sd_green, sd_blue]) lst_of_red.clear() lst_of_green.clear() lst_of_blue.clear() print(' arrays cleared') if not ret: break b, g, r = cv2.split(frame) lst_of_red.append(r.sum(axis=0).sum(axis=0) / r.size) lst_of_green.append(g.sum(axis=0).sum(axis=0) / g.size) lst_of_blue.append(b.sum(axis=0).sum(axis=0) / b.size) abstract_seconds += 1 / fps print(lst_of_data) lst_of_all_videos_data.append(lst_of_data) lst_of_data.clear()
我终于写了。整个程序将在超过1分钟的视频上运行足够长的时间。如果你的电脑很弱,那么我并不羡慕你。但总的来说,它工作得很好。这是:
相关问题 更多 >
编程相关推荐