基于OpenCV 4.7 C++实现视频车辆识别与速度估计
基于OpenCV 4.7 C++实现视频车辆识别与速度估计
这篇博客将介绍如何使用OpenCV 4.7和C++语言编写一个程序,该程序可以:
- 读入一段视频。
- 识别视频中行驶的车辆。
- 用红色矩形框标记车辆。
- 用绿色十字标记矩形的几何中心。
- 基于光流原理估算车辆速度。
代码实现
以下代码包含五个部分:读入视频、车辆识别、绘制矩形框、标记几何中心以及计算车速。
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
// 读入视频
VideoCapture cap('test.mp4');
if (!cap.isOpened())
{
std::cout << 'Error opening video file' << std::endl;
return -1;
}
// 车辆识别
Mat frame, gray, prevGray, flow, hsv;
std::vector<std::vector<Point>> contours;
while (cap.read(frame))
{
cvtColor(frame, gray, COLOR_BGR2GRAY);
if (!prevGray.empty())
{
calcOpticalFlowFarneback(prevGray, gray, flow, 0.5, 3, 15, 3, 5, 1.2, 0);
cvtColor(frame, hsv, COLOR_BGR2HSV);
for (int i = 0; i < flow.rows; i += 10)
{
for (int j = 0; j < flow.cols; j += 10)
{
Point2f f = flow.at<Point2f>(i, j);
if (norm(f) > 5)
{
circle(frame, Point(j, i), 2, Scalar(0, 255, 0), -1);
rectangle(frame, Rect(j - 20, i - 20, 40, 40), Scalar(0, 0, 255), 2);
}
}
}
findContours(gray, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
for (int i = 0; i < contours.size(); i++)
{
Rect rect = boundingRect(contours[i]);
if (rect.width > 50 && rect.height > 50)
{
rectangle(frame, rect, Scalar(0, 0, 255), 2);
Point center = Point(rect.x + rect.width / 2, rect.y + rect.height / 2);
line(frame, Point(center.x - 10, center.y), Point(center.x + 10, center.y), Scalar(0, 255, 0), 2);
line(frame, Point(center.x, center.y - 10), Point(center.x, center.y + 10), Scalar(0, 255, 0), 2);
}
}
}
prevGray = gray.clone();
// 车速计算
// ...
imshow('frame', frame);
if (waitKey(30) == 27) break;
}
return 0;
}
代码解析
-
读入视频: 使用
VideoCapture类读入视频文件 'test.mp4'。如果无法打开视频文件,则输出错误信息并退出程序。 -
车辆识别:
- 使用
cvtColor函数将当前帧转换为灰度图像。 - 如果前一帧存在,则使用
calcOpticalFlowFarneback函数计算光流。 - 遍历光流向量,如果向量大小超过阈值,则认为该区域有运动物体,并在对应位置绘制圆形和矩形框。
- 使用
findContours函数查找轮廓,并根据轮廓大小筛选出车辆,绘制红色矩形框。
- 使用
-
绘制矩形框: 使用
rectangle函数在检测到的车辆周围绘制红色矩形框。 -
标记几何中心: 使用
line函数绘制绿色十字,标记矩形的几何中心。 -
车速计算: 这部分代码需要根据具体情况实现,例如可以根据光流向量的大小和方向计算车辆的速度。
总结
本文介绍了如何使用 OpenCV 4.7 和 C++ 语言实现一个简单的车辆识别和速度估计程序。程序使用光流法检测运动物体,并结合轮廓检测识别车辆。最后,可以通过分析光流信息估算车辆速度。
原文地址: https://www.cveoy.top/t/topic/jPry 著作权归作者所有。请勿转载和采集!