嗯,产生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_movedmm_per_pixel_mesurment) / (Sum_of_frames_TrackedFrame_Rate)
或:
速度 = (overall_distance_moved*mm_per_pixel_mesurment) / (Time_object_was_tracked_for)
总而言之,这是可以做到的,但这很困难,这就是为什么要使用声纳或红外线等不同技术来准确跟踪速度的原因。
至少在英国,一个有趣的例子是使用画线和测速摄像头。这些线之间的距离必须在特定测量值的 5 毫米范围内,然后根据这些参考值计算车辆的速度(通过同一辆车的两张图片)。这是一种提供图像深度数据的欺骗方式。这些正在被替换为声纳类型,好像这些线不在设定量的 5 毫米距离内,无法准确测量速度并且无法在法庭上站立。
好的,我有点想知道,但除非您在已知距离和已知大小处跟踪对象,否则如果没有来自特定相机(如动力学相机)或来自特定相机的深度数据,您将无法获得速度或速度两个摄像头相隔一定距离。 (请注意,如果您知道相机行进的距离并且没有旋转,则可以使用一台相机和两帧来完成)。
希望对你有帮助,
干杯,
克里斯