我在 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/秒。
关于opencv - 通过 Blob 估算车速,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37353366/