opencv - 通过 Blob 估算车速

标签 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);
        }

    }
}

最佳答案

在一般情况下,为了根据 2D 图像预测车辆在 3 维空间中的速度,您需要知道车辆的方向(行驶方向)和与相机的距离。

例如,如果您知道车辆垂直于相机指向的方向行驶(直接穿过框架,根本不朝向或远离相机),您可以使用其中之一

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

使用多个帧计算车辆的速度。

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

更新

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

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

View from security camera

关于opencv - 通过 Blob 估算车速,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37353366/

相关文章:

image-processing - Pytorch - 迁移学习教程中图像预处理的目的

opencv - 在 ubuntu 18.04 上安装 openCV 2.4.9 时遇到问题

c++ - 类定义和调用有困难

python - 如何将图像从 scikit-image 转换为 opencv2 和其他库?

c++ - 从透视图到正交图

python - Pygame:将png图像中的所有白色像素转换为完全透明

java - 如何提高特征脸算法的准确性?

opencv - OpenCV中的对应分析

c++ - 如何使用 OpenCV 从图像中提取文本行

image - 如何检测图像中有一点噪声的线条?