【问题标题】:Can I do it with histogram (frequency distribution)?我可以用直方图(频率分布)吗?
【发布时间】:2021-11-06 10:46:04
【问题描述】:

我已经从视频中提取帧并转换成光流看起来像这样;

您可以清楚地看到,有些帧提供了运动对象的信息(frame000037、frame000039 等),有些是静态的(frame000038、frame000040、frame000042 等)。

我已经阅读了静态帧和移动帧以查看使用 OpenCV 的差异,谁能告诉我谁能过滤掉那些包含运动信息的所有帧?

我采用了平均值、标准偏差、归一化,但它们对我不起作用,因为静态的像素值可能大于可移动的像素值,并且在某些情况下它可能小于可移动的,因此它不起作用每种情况。

【问题讨论】:

  • 似乎每两帧出现一次空帧。每两帧没有信息。因此,首先,您可以考虑只处理非空帧。可能问题不是opencv,而是你的帧速率。
  • 在光流上计算合适的统计数据到底有什么问题?想出两个阈值应该很简单,一个将每个像素标记为移动/静态,另一个表示总共有多少像素在移动/不移动。 -- 是的,一个简单的直方图可以提供更多信息,但您不需要更多。
  • 我不敢相信标准差不起作用。正如马里奥所指出的,每隔一帧都是安静的,这是不正常的。
  • 每隔一帧都是静态的,因为它没有在可移动帧之后移动。并非所有帧都如此,有些帧是连续运动的。您有什么建议让我了解两个框架之间的差异,然后可以选择那些可移动的框架。
  • 静态帧可能来自某些人对视频的严重转换,或者在编辑原始素材时不知道帧速率。 -- 你应该绘制运动矢量的幅度,而不是你在那里做的任何事情。

标签: python opencv image-processing computer-vision


【解决方案1】:

您可以np.sum 每帧的白色像素并将结果用作权重。您的空框架结果将是恒定的,等于框架的面积。所以你可以检查框架是否为空。

import cv2
import numpy as np

img1=cv2.imread("/tmp/frame0.bmp",0)
img2=cv2.imread("/tmp/frame1.bmp",0)

th = 150

ret, m1 = cv2.threshold(img1,th,255,cv2.THRESH_BINARY_INV)
ret, m2 = cv2.threshold(img2,th,255,cv2.THRESH_BINARY_INV)

n_pix1 = np.sum(m1 == 255)
n_pix2 = np.sum(m2 == 255)

print(n_pix1,n_pix2)


cv2.imshow("1",m1)
cv2.imshow("2",m2)

cv2.waitKey(0)

【讨论】:

    猜你喜欢
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    • 2011-09-06
    • 2021-12-01
    • 1970-01-01
    相关资源
    最近更新 更多