有498张图像序列,我用cv2.calcOpticalFlowFarneback计算了它的光流。所以现在我有497个矢量图代表我的运动矢量,这些矢量是用大小和方向来描述的。
我需要做的是生成一个直方图,在x-axis上我有角度范围,单位是度。更具体地说,我有12个容器,其中第一个容器包含所有方向为0 < angle < 30的向量,第二个容器为30 < angle < 60,以此类推。相反,在y-axis上,我需要得到每个角度区间中包含的向量的模之和。
说白了就是对计算的光流结果建立光流方向直方图
请问有没有现成的代码?或者有相关的代码实现思路也行!
谢谢
这就是梯度方向直方图 HOG,用 Numpy 可以实现,用 OpenCV 也可以。
可以参考:
【OpenCV 例程 300篇】248. 特征描述之HOG描述符 (https://blog.csdn.net/youcans/article/details/127970587)
【OpenCV 例程200篇】45. 图像的灰度直方图 (https://blog.csdn.net/youcans/article/details/121543352)
可以使用 numpy 的 histogram 函数来生成直方图。可以先将角度转换为弧度制,然后使用 arctan2 函数计算每个矢量的角度。可以使用 numpy 的 rad2deg 函数将弧度转换为度。然后将角度转换为整数,并将其分配给相应的容器。使用 numpy 的 histogram 函数生成直方图。
这是一个示例代码:
import numpy as np
# 将角度转换为弧度制
angles = np.deg2rad(angles)
# 计算每个矢量的角度
angles = np.arctan2(vectors[:, 1], vectors[:, 0])
# 将角度转换为度
angles = np.rad2deg(angles)
# 将角度转换为整数
angles = np.round(angles).astype(int)
# 创建12个容器,每个容器代表30度的角度范围
bins = np.arange(0, 360, 30)
# 生成直方图
hist, _ = np.histogram(angles, bins=bins, weights=magnitudes)
可以使用 matplotlib 库来绘制直方图。例如可以使用 matplotlib 的 bar 函数来绘制直方图。
这是一个示例代码:
import matplotlib.pyplot as plt
# 绘制直方图
plt.bar(bins[:-1], hist, width=30)
# 设置x轴和y轴标签
plt.xlabel('Angle (degrees)')
plt.ylabel('Number of vectors')
# 显示图表
plt.show()
仅供参考,望采纳。