【问题标题】:Find mean and sd of red and blue colour values in video查找视频中红色和蓝色颜色值的均值和标准差
【发布时间】:2021-02-17 15:55:19
【问题描述】:

我有视频文件,我可以将其转换为 RGB 空间,每帧使用cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

然后我想计算红色和蓝色值的平均值和标准偏差,在 100 秒内进行平均和 sd'ed。我的视频长度 > 100 秒,因此希望每 100 秒重复一次并将值分配给向量。 因此,对于每第 n 个 100 秒的剪辑,我有值 R(ave)、R(sd)、B(ave)、B(sd)。

我对 CV 和视频处理还很陌生,因此希望能在这方面提供任何帮助。

【问题讨论】:

  • 你有代码吗?或者你看过关于 cv2 的课程吗?
  • @crackanddie 完成了基础课程,但没有任何内容能准确涵盖这一点。诚然,我的代码目前是裸露的,因此希望能朝着正确的方向轻推。我可以为每一帧得到colours = cv2.imread(frame, cv2.IMREAD_UNCHANGED) b,g,r = (colours[300, 300])
  • 好的,如果你不着急的话,我明天去处理
  • @crackanddie

标签: python image-processing video-processing cv2


【解决方案1】:

终于写好了。整个程序将在超过 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()

【讨论】:

  • 清晰、简洁且非常有帮助,谢谢!!!!!!
最近更新 更多