我正在尝试创建按动议排序的运动组件的有序列表。例如,在街景摄像机中,我首先想要车辆,然后是自行车,然后是行人。这可以在Emgu中使用MotionDetector示例吗?
if (motionPixelCount < comp.area * 0.05) continue;
这似乎是某种阈值,但motionPixelCount究竟意味着什么?这可以代表运动组件的速度/速度吗?或完全不同的东西? 它正在与组件区域进行比较。
tl; dr:如何确定运动组件相对于其他物体的速度/速度?
答案 0 :(得分:2)
生成motionPixelCount的函数摘要如下:
public void MotionInfo(Rectangle motionRectangle, out double angle, out double motionPixelCount);
//
// Summary:
// Given a rectagle area of the motion, output the angle of the motion and the
// number of pixels that are considered to be motion pixel
//
// Parameters:
// motionRectangle:
// The rectangle area of the motion
//
// angle:
// The orientation of the motion
//
// motionPixelCount:
// Number of motion pixels within silhoute ROI
通过检查已移动的motionRectangle的ROI集合中的像素数量来进行阈值处理。这可以防止数十亿个结果,其中1或2个像素似乎已移动。但是,通过设置更准确的ROI到车辆的位置,您可以删除此阈值,因为您知道不太可能存在您不关心的随机小动作。
我们可以使用这些数据来计算被检查组件的速度和速度,但是我们需要一些特定的数据。我们需要知道特定距离处物体的像素到实际测量值。我在answer to this question中详细讨论了这个特殊问题。如果我们知道被跟踪物体的大小和距离相机的距离很容易,但通常情况并非如此。
如果我们有一个固定距离的物体,那么我们可以用现实世界的术语粗略地取出物体的面积,并将其除以物体所占的像素面积。这比执行FOV计算更容易,因为它不需要精确的距离测量,但是可以计算对象的面积越精确,跟踪结果就越准确。如果我们得到这个pixel_per_mm测量值,那么:
此功能为您提供整体运动距离:
double overallAngle, overallMotionPixelCount;
_motionHistory.MotionInfo(motionMask.ROI, out overallAngle, out overallMotionPixelCount);
因此:
速度=(overallMotionPixelCount * mm_per_pixel_mesurment)/ Time_Between_Frames
如果我的物理学仍处于划痕状态,速度与速度不同,并且需要你随着时间的推移跟踪物体,我认为你只是在速度之后但是大致:
速度=(overall_distance_moved mm_per_pixel_mesurment)/(Sum_of_frames_Tracked Frame_Rate)
或:
速度=(overall_distance_moved * mm_per_pixel_mesurment)/(Time_object_was_tracked_for)
总之,这可以做到但是很难并且为什么使用诸如声纳或红外线的不同技术来准确地跟踪速度。
至少在英国,一个有趣的例子是使用彩绘线和速度相机。这些线之间的距离必须在特定测量值的5mm范围内,然后根据这些参考值计算车辆的速度(通过同一辆车的两张图片)。这是提供图像深度数据的作弊方式。这些被替换为声纳类型,好像这些线不在设定量的5mm距离内,速度无法准确测量,无法在法庭上站立。
好的,我想知道一点,但除非你跟踪一个已知距离和已知大小的物体,否则无法获得速度或速度而没有来自特定相机(例如动力学)的深度数据或来自两台摄像机分开了距离。 (注意,如果您知道相机行进的距离并且没有旋转,则可以使用一个相机和两个相框完成。)
我希望这可以帮到你,
干杯,
克里斯