通过Blob进行车速估算

时间:2016-05-20 18:19:04

标签: opencv image-processing

我在OpenCV中检测到车辆为blob。下面是blob.h文件

class Blob {
public:
    // member variables 
    std::vector<cv::Point> currentContour;
    cv::Rect currentBoundingRect;
    std::vector<cv::Point> centerPositions;
    double dblCurrentDiagonalSize;
    double dblCurrentAspectRatio;
    bool blnCurrentMatchFoundOrNewBlob;
    bool blnStillBeingTracked;
    int intNumOfConsecutiveFramesWithoutAMatch;
    cv::Point predictedNextPosition;
    // function prototypes 
    Blob(std::vector<cv::Point> _contour);
    void predictNextPosition(void);
};

我应该使用什么算法来估算检测到的车辆的速度?

先谢谢。

更新

这是我试图估算速度的代码,但它并没有把文字加上它崩溃。

for (auto blob : blobs) {

    if (blob.blnStillBeingTracked == true && blob.centerPositions.size() >= 2) {
        int prevFrameIndex = (int)blob.centerPositions.size() - 2;
        int currFrameIndex = (int)blob.centerPositions.size() - 1;
        if (blob.centerPositions[prevFrameIndex].y > (intHorizontalLinePosition-50) && blob.centerPositions[currFrameIndex].y <= intHorizontalLinePosition) {
            int distance = blob.centerPositions[currFrameIndex].y - blob.centerPositions[0].y;
            int tickCount = cv::getTickCount();
            int time = (tickCount - blob.firstTickCount)/cv::getTickFrequency();
            int speed = distance/time;
            double dblFontScale = blobs[currFrameIndex].dblCurrentDiagonalSize / 10.0;
            int intFontThickness = (int)std::round(dblFontScale * 1.0);
            std::cout<<"Speed: "<<speed<<std::endl;
            cv::putText(img, std::to_string(speed), blobs[currFrameIndex].centerPositions.back(), CV_FONT_HERSHEY_SIMPLEX, dblFontScale, SCALAR_GREEN, intFontThickness);
        }

    }
}

1 个答案:

答案 0 :(得分:3)

为了在一般情况下从2D图像预测车辆在三维空间中的速度,您需要知道车辆的方向(行进方向)和距离摄像机的距离。

如果您知道车辆垂直于摄像机指向的方向(直接穿过框架,而不是朝向或远离摄像机),则可以使用

a)从相机到道路和基本三角测量的已知距离,或 b)已知距离的标记

使用几帧计算车辆的速度。

如果您知道车辆直接朝向摄像机或直接远离摄像机,则可以使用图像轮廓的宽度/高度变化来了解车辆的速度。如果您还可以识别车辆何时通过距离摄像机已知距离的地标,您可以计算车辆的实际宽度/高度,从而使用已知的宽度/高度和大小的变化率准确计算速度。车辆的2D投影。

<强>更新

鉴于附加信息,您似乎可以确定相机2D图像中的Y位置对应于道路上的特定距离。如果你测量两个这样的点,你可以计算currentBoundingRect的下限从第一个点传递到第二个点所需的时间,例如在下图中,从y = 800移动到y = 200。

如果从y = 800移动到y = 200需要2秒,移动100m - 50m = 50m或50m / 2秒= 25m /秒也需要2秒。

View from security camera