,并在矩形框上标出车速。

以下是一个简单的实现过程:

  1. 读入视频并初始化光流法参数
cv::VideoCapture cap("video.mp4");
if (!cap.isOpened()) {
    std::cerr << "Failed to open video file!" << std::endl;
    return -1;
}

cv::Mat frame, prevFrame, gray, prevGray;
std::vector<cv::Point2f> prevPts, currPts;
cv::TermCriteria termcrit(cv::TermCriteria::COUNT|cv::TermCriteria::EPS,20,0.03);
cv::Size subPixWinSize(10,10), winSize(31,31);
int maxLevel = 3;
double minEigThreshold = 0.1;
  1. 循环读取每一帧视频并进行处理
while (cap.read(frame)) {
    // 转换为灰度图像
    cv::cvtColor(frame, gray, cv::COLOR_BGR2GRAY);

    // 如果是第一帧,则初始化特征点
    if (prevGray.empty()) {
        prevGray = gray.clone();
        cv::goodFeaturesToTrack(prevGray, prevPts, 500, 0.01, 10);
        cv::cornerSubPix(prevGray, prevPts, subPixWinSize, cv::Size(-1,-1), termcrit);
    }

    // 计算光流
    currPts.clear();
    std::vector<uchar> status;
    std::vector<float> err;
    cv::calcOpticalFlowPyrLK(prevGray, gray, prevPts, currPts, status, err, winSize, maxLevel, termcrit, 0, minEigThreshold);

    // 绘制矩形框和标记车速
    for (size_t i = 0; i < currPts.size(); ++i) {
        if (status[i] == 0) continue;
        cv::Rect rect(currPts[i].x - 20, currPts[i].y - 20, 40, 40);
        cv::rectangle(frame, rect, cv::Scalar(0, 0, 255), 2);
        cv::drawMarker(frame, cv::Point(currPts[i].x, currPts[i].y), cv::Scalar(0, 255, 0), cv::MARKER_CROSS, 20);
        double speed = cv::norm(currPts[i] - prevPts[i]);
        cv::putText(frame, cv::format("%.2f", speed), cv::Point(rect.x + 5, rect.y + 25), cv::FONT_HERSHEY_SIMPLEX, 0.8, cv::Scalar(0, 0, 255), 2);
    }

    // 更新特征点
    prevGray = gray.clone();
    prevPts = currPts;
}

在这个处理过程中,我们首先将每一帧图像转换为灰度图像,然后使用光流法计算当前帧和前一帧之间的特征点的运动,根据运动的大小可以估算出车速。接着,我们绘制矩形框和标记车速,最后更新特征点并进入下一帧的处理。

需要注意的是,这个程序只是一个简单的示例,实际上在实际应用中还需要考虑很多问题,比如如何准确地检测车辆,如何排除误检等等

你好使用opencv47使用c++语言实现一个程序程序可以读入一段视频视频中会有车辆经过程序需要识别视频中的车辆将车辆用红色矩形框标出矩形的几何中心用绿色十字标出根据光流原理计算车速

原文地址: https://www.cveoy.top/t/topic/clzd 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录