当前位置: 首页 > news >正文

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 工具包

主要成员函数

创建对象

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

设置与获取参数

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

执行光流计算

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

代码示例

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

运行结果

在这里插入图片描述

http://www.xdnf.cn/news/952039.html

相关文章:

  • 【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
  • MAZANOKE结合内网穿透技术实现跨地域图像优化服务的远程访问过程
  • 零基础设计模式——行为型模式 - 命令模式
  • 使用地球观测数据优化云到 GPU 的吞吐量以进行深度学习
  • rm视觉学习1-自瞄部分
  • 使用python进行图像处理—图像标识与NumPy(3)
  • 【PDF识别改名】PDF指定区域OCR识别重命名工具使用教程和注意事项
  • 前缀和题目:寻找数组的中心下标
  • NoSQL 之 Redis 集群
  • JS红宝书笔记 10.6 - 10.10 函数
  • 树莓派超全系列教程文档--(60)树莓派摄像头操作命令及使用其一
  • Cyber Weekly #59
  • 如何在网页里填写 PDF 表格?
  • MyBatis中关于缓存的理解
  • Spring Framework 6:核心升级特性
  • 2023赣州旅游投资集团
  • OptiStruct结构分析与工程应用:传递路径贡献量分析(TPA)
  • 接口 RESTful 中的超媒体:REST 架构的灵魂驱动
  • 数据集分享 | MOT17数据集、UAVDT数据集
  • qt 双缓冲案例对比
  • 面试高频问题
  • 魔兽世界正式服插件与宏-敏锐盗贼实用宏探索(1)-宏命令制作入门与基本知识
  • 从面试角度回答Android中ContentProvider启动原理
  • android13 app的触摸问题定位分析流程
  • 邮科ODM摄像头:多维度护航高铁安全系统方案解析
  • Kubernetes ClusterIP 端口深度解析:虚拟服务与流量转发机制
  • 我的世界Java版1.21.4的Fabric模组开发教程(十三)自定义方块状态
  • 椭圆曲线密码学(ECC)
  • 基于ADMM的MRI-PET高质量图像重建算法
  • 【Linux】进程间通讯-消息队列