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);
        }
    }
}

运行结果

相关推荐
waterfeeling1 小时前
用 Context7 做一次点云配准的调研—测试—报告闭环:鲁棒 ICP
人工智能
Data-Miner5 小时前
面对 AI 大模型智能涌现,如何从技术层面保护好隐私与数据安全?
大数据·人工智能
hpoenixf5 小时前
当 AI 开始谈“买什么”,研究助手离投顾和交易还有多远?
人工智能
大模型真好玩5 小时前
如何让视频模型对你言听计从?结构化提示词助你生成电影级画面
人工智能·agent·deepseek
zhang133830890756 小时前
传统机械三杯式风速传感器易磨损冻堵?CG-88金属超声波风速风向传感器给出免运维方案
运维·服务器·网络·人工智能·自动化
特立独行的猫a6 小时前
会说确认叫车才下单-启元机器人官方滴滴打车技能源码详解
人工智能·机器人·技能·启元机器人
老金带你玩AI6 小时前
GPT-6.1 Terra上线:更便宜了,干活到底怎么样?
人工智能
会议咨询6 小时前
2027年电力电子、人工智能与大数据国际会议(PEABD 2027)
大数据·人工智能·电力电子
Jsundoku7 小时前
第五章 深度学习 -- 卷积神经网络
人工智能·深度学习·cnn
水如烟7 小时前
孤能子视角:SEP《人工智能的认识论》EIS读法·理解——理解幻觉与解压缩幻觉:同一缺口,两份报告
人工智能