OPenCV CUDA模块光流处理------利用Nvidia GPU的硬件加速能力来计算光流类cv::cuda::NvidiaHWOpticalFlow

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

cv::cuda::NvidiaHWOpticalFlow 是 OpenCV CUDA 模块中的一个类,专门用于利用 Nvidia GPU 的硬件加速能力来计算光流。这个类允许用户使用 Nvidia 提供的硬件加速功能进行高效的光流计算,特别适用于需要实时处理或高性能的应用场景。

类概述

  • 命名空间:cv::cuda
  • 继承自:cv::DenseOpticalFlow
  • 用途:利用 Nvidia GPU 硬件加速执行光流计算
  • 支持的操作系统:需要安装有兼容版本的 Nvidia 驱动程序和 CUDA 工具包

主要成员函数

创建对象

cpp 复制代码
static Ptr<NvidiaHWOpticalFlow> create(int preset = 0, const Map<String, float>& options = Map<String, float>());
  • preset: 预设配置选项(默认为0)
  • options: 自定义配置参数

设置与获取参数

  • 设置参数:
cpp 复制代码
void set(const String& key, float value);
  • 获取参数:
cpp 复制代码
float get(const String& key) const;

执行光流计算

cpp 复制代码
void calc(InputArray I0, InputArray I1, InputOutputArray flow);
  • I0: 第一帧图像
  • I1: 第二帧图像
  • flow: 输出的光流场

代码示例

cpp 复制代码
#include <opencv2/opencv.hpp>
#include <opencv2/cudaimgproc.hpp>  // for upload/download
#include <opencv2/cudaoptflow.hpp>


// 前置声明(可选)
void drawOpticalFlow(const cv::Mat& flow, cv::Mat& dst, int step = 16);

int main() {
    // 加载图像
    cv::Mat frame1 = cv::imread("/media/dingxin/data/study/OpenCV/sources/images/frame1.png", cv::IMREAD_GRAYSCALE);
    cv::Mat frame2 = cv::imread("/media/dingxin/data/study/OpenCV/sources/images/frame2.png", cv::IMREAD_GRAYSCALE);

    if (frame1.empty() || frame2.empty()) {
        std::cerr << "无法加载图像" << std::endl;
        return -1;
    }

    // 创建光流算法对象
    cv::Ptr<cv::DenseOpticalFlow> algo = cv::FarnebackOpticalFlow::create();
    cv::Mat flow;

    // 计算光流
    algo->calc(frame1, frame2, flow);

    // 显示光流图
    cv::Mat flowImg;
    drawOpticalFlow(flow, flowImg);  // 调用自定义绘制函数


    cv::imshow("Frame 1", frame1);
    cv::imshow("Frame 2", frame2);
    cv::imshow("Optical Flow", flowImg);
    cv::waitKey(0);

    return 0;
}

// 自定义函数:绘制光流矢量
void drawOpticalFlow(const cv::Mat& flow, cv::Mat& dst, int step) {
    dst = cv::Mat::zeros(flow.size(), CV_8UC3);

    for (int y = 0; y < flow.rows; y += step) {
        for (int x = 0; x < flow.cols; x += step) {
            const cv::Point2f f = flow.at<cv::Point2f>(y, x);
            cv::line(dst, cv::Point(x, y), cv::Point(cvRound(x + f.x * 5), cvRound(y + f.y * 5)),
                     cv::Scalar(0, 255, 0));
            cv::circle(dst, cv::Point(cvRound(x + f.x * 5), cvRound(y + f.y * 5)), 1,
                       cv::Scalar(0, 255, 0), -1);
        }
    }
}

运行结果

相关推荐
奔跑中的小象15 小时前
统信UOS + 天数AI卡部署SGLang服务手册
人工智能·uos·sglang·天数智芯
DevSecOps选型指南15 小时前
中国版Mythos,为何是悬镜安全灵脉CodeAI?
人工智能·安全
Shockang15 小时前
LangGraph 状态机实战
人工智能
刹那芳华199215 小时前
循环神经网络的从零开始实现(RNN)
人工智能·rnn·深度学习
阿童木写作16 小时前
跨境图片翻译工具多合一,批量图片视频字幕翻译加智能抠图
人工智能·python·音视频·语音识别
科技之门16 小时前
AI3D从建模到贴图、绑骨和动画的完整流程怎么做?V2Fun完整工作流指南
人工智能·3d·贴图
宇宙第一小趴菜16 小时前
二、机器学习的应用领域和发展史
人工智能·机器学习
前端开发江鸟16 小时前
我写过 MCP Server,却一直以为 MCP 只有 Tool
人工智能
天国梦16 小时前
自习室智能化升级避坑指南:天学网AI智习室方案实测与选型建议
大数据·人工智能
阿里云云原生17 小时前
可用性从 99.9% 跃升至 99.995%:畅捷通如何用 AI 重塑运维底座?
运维·网络·人工智能