OpenCV 光流法总结

0.概述

1.原理说明

2.代码实现

#include <iostream>
#include <opencv2/opencv.hpp>

int main(int argc, char** argv) {
    if(argc != 2) {
        std::cerr << "Usage: " << argv[0] << " <video_path>" << std::endl;
        return -1;
    }

    cv::VideoCapture cap(argv[1]);
    if(!cap.isOpened()) {
        std::cerr << "Error: Couldn't open the video file." << std::endl;
        return -1;
    }

    cv::Mat oldFrame, oldGray;
    std::vector<cv::Point2f> oldCorners;

    // Parameters for Shi-Tomasi corner detection
    int maxCorners = 100;
    double qualityLevel = 0.3;
    double minDistance = 7;
    int blockSize = 7;

    cap >> oldFrame;
    cv::cvtColor(oldFrame, oldGray, cv::COLOR_BGR2GRAY);

    // Detect corners in the first frame
    cv::goodFeaturesToTrack(oldGray, oldCorners, maxCorners, qualityLevel, minDistance, cv::Mat(), blockSize);

    // Color for optical flow
    cv::Scalar color(0, 255, 0);  // Green

    while(true) {
        cv::Mat frame, gray;
        cap >> frame;

        if(frame.empty()) {
            break;
        }

        cv::cvtColor(frame, gray, cv::COLOR_BGR2GRAY);

        std::vector<cv::Point2f> newCorners;
        std::vector<uchar> status;
        std::vector<float> err;

        // Calculate optical flow using Lucas-Kanade method
        cv::calcOpticalFlowPyrLK(oldGray, gray, oldCorners, newCorners, status, err);

        // Draw the motion vectors
        for(size_t i = 0; i < oldCorners.size(); i++) {
            if(status[i]) {
                cv::line(frame, oldCorners[i], newCorners[i], color, 2);
                cv::circle(frame, newCorners[i], 5, color, -1);
            }
        }

        // Display the result
        cv::imshow("Optical Flow - Lucas-Kanade", frame);

        if(cv::waitKey(30) == 27) {  // Exit on pressing 'Esc' key
            break;
        }

        // Update the previous frame and corners
        oldGray = gray.clone();
        oldCorners = newCorners;
    }

    cap.release();
    cv::destroyAllWindows();

    return 0;
}

相关推荐

  1. OpenCV 总结

    2024-05-13 07:38:03       8 阅读
  2. 跟踪

    2024-05-13 07:38:03       11 阅读
  3. 大全

    2024-05-13 07:38:03       11 阅读
  4. 09 实践

    2024-05-13 07:38:03       29 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-13 07:38:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-13 07:38:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-13 07:38:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-13 07:38:03       18 阅读

热门阅读

  1. boto3库调用AWS大模型的封装类

    2024-05-13 07:38:03       11 阅读
  2. 排序算法 下

    2024-05-13 07:38:03       13 阅读
  3. Vue简介

    2024-05-13 07:38:03       12 阅读
  4. Yarn使用

    2024-05-13 07:38:03       9 阅读
  5. TensorFlow基于anaconda3快速构建

    2024-05-13 07:38:03       9 阅读
  6. redis面试

    2024-05-13 07:38:03       9 阅读
  7. MySQL数据库基础功能

    2024-05-13 07:38:03       8 阅读
  8. linux程序分析命令(一)

    2024-05-13 07:38:03       9 阅读
  9. 从零手写实现 tomcat-11-filter 过滤器

    2024-05-13 07:38:03       8 阅读
  10. 百度go【面试真题】

    2024-05-13 07:38:03       9 阅读
  11. android xml 定义渐变色背景

    2024-05-13 07:38:03       7 阅读