我在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);
}
}
}
答案 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秒。