OpenCV CUDA Morphology 比 CPU 慢得多

2024-03-01

我正在处理维度图像2208x1242来自 while 循环中的视频,使用 C++ 和 OpenCV。
为了加快速度,我想在 Nvidia Jetson Nano 的 GPU 上执行操作。
对于从 BGR 到 HSV 的颜色转换,使用cv::cuda::cvtColor代替cv::cvtColor我的速度提高了 5 倍。

不幸的是,形态学运算在 GPU 上要慢得多:

int num_frame = 10;
int frame = 0;

cv::Mat img;
cv::cuda::GpuMat img_gpu;

cv::Mat open_kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(11, 11));
cv::Mat close_kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(21, 21));

while (frame < num_frame){

  // load image to img
  // ...

  img_gpu.upload(img);

  cv::Ptr<cv::cuda::Filter> morph_filter_open = cv::cuda::createMorphologyFilter(cv::MORPH_OPEN, img_gpu.type(), open_kernel);
  cv::Ptr<cv::cuda::Filter> morph_filter_close = cv::cuda::createMorphologyFilter(cv::MORPH_CLOSE, img_gpu.type(), close_kernel);

  morph_filter_open->apply(img_gpu, img_gpu);
  morph_filter_close->apply(img_gpu, img_gpu);

  frame++;
}

仅测量apply()-调用,GPU 版本大约慢 20 倍cv::morphologyEx在 Jetson Nano 的 CPU 上(0.07s vs. 1.5s对于单帧)。

nvprof表明,大部分时间都花在做cudaDeviceSynchronize(这是为了整个程序比上面的代码示例做更多的事情,但长时间运行的操作可能与形态有关):

  API calls:   71.05%  17.2756s       665  25.978ms  25.730us  1.44814s  cudaDeviceSynchronize
                8.36%  2.03194s      1826  1.1128ms  34.844us  847.66ms  cudaLaunchKernel
                5.16%  1.25490s         1  1.25490s  1.25490s  1.25490s  cuCtxDestroy
                4.80%  1.16684s       544  2.1449ms  17.865us  10.378ms  cudaMallocPitch
                1.89%  460.14ms       616  746.98us  20.469us  346.82ms  cudaFree
                1.65%  401.38ms        76  5.2813ms  44.533us  19.211ms  cudaMemcpy2D
                1.45%  352.97ms        51  6.9209ms  18.803us  242.14ms  cudaMalloc
                1.42%  345.25ms         1  345.25ms  345.25ms  345.25ms  cudaFuncGetAttributes
                1.23%  299.95ms         1  299.95ms  299.95ms  299.95ms  cuCtxCreate
                1.03%  251.43ms        20  12.572ms  162.61us  103.74ms  cudaMallocManaged
                0.92%  224.67ms        13  17.283ms  32.553us  65.173ms  cudaMemcpy
                0.56%  135.48ms         1  135.48ms  135.48ms  135.48ms  cudaDeviceReset
...

我希望有人能帮我找出问题所在!


我遇到了同样的问题,我设法在一定程度上提高了基于 CUDA 的形态学的性能。我没有在循环中创建形态过滤器对象,而是取出对象创建并将其放在图像捕获循环之外。

所以代码应该是这样的:

int num_frame = 10;
int frame = 0;

cv::Mat img;
cv::cuda::GpuMat img_gpu;

cv::Mat open_kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(11, 11));
cv::Mat close_kernel = cv::getStructuringElement(cv::MORPH_RECT, 

cv::Size(21, 21));

// Morphology filter object creation outside the loop.
cv::Ptr<cv::cuda::Filter> morph_filter_open = cv::cuda::createMorphologyFilter(cv::MORPH_OPEN, img_gpu.type(), open_kernel);
cv::Ptr<cv::cuda::Filter> morph_filter_close = cv::cuda::createMorphologyFilter(cv::MORPH_CLOSE, img_gpu.type(), close_kernel);

while (frame < num_frame){

  // load image to img
  // ...

  img_gpu.upload(img);

  morph_filter_open->apply(img_gpu, img_gpu);
  morph_filter_close->apply(img_gpu, img_gpu);

  frame++;
}

除此之外,我找不到任何方法来提高 CUDA 形态过滤器的性能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCV CUDA Morphology 比 CPU 慢得多 的相关文章

  • 用于代数简化和求解的 C# 库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 网络上有很多代数求解器和简化器 例如 algebra com 上不错的代数求解器和简化器 然而 我正在
  • 为什么 int8_t 和用户通过 cin 输入显示奇怪的结果[重复]

    这个问题在这里已经有答案了 一小段代码让我发疯 但希望你能阻止我跳出窗外 看这里 include
  • 计算 Richtextbox 中所有单词的最有效方法是什么?

    我正在编写一个文本编辑器 需要提供实时字数统计 现在我正在使用这个扩展方法 public static int WordCount this string s s s TrimEnd if String IsNullOrEmpty s re
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • 在 C 中匹配二进制模式

    我目前正在开发一个 C 程序 需要解析一些定制的数据结构 幸运的是我知道它们是如何构造的 但是我不确定如何在 C 中实现我的解析器 每个结构的长度都是 32 位 并且每个结构都可以通过其二进制签名来识别 举个例子 有两个我感兴趣的特定结构
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 使用 Newtonsoft 和 C# 反序列化嵌套 JSON

    我正在尝试解析来自 Rest API 的 Json 响应 我可以获得很好的响应并创建了一些类模型 我正在使用 Newtonsoft 的 Json Net 我的响应中不断收到空值 并且不确定我的模型设置是否正确或缺少某些内容 例如 我想要获取
  • 如何创建包含 IPv4 地址的文本框? [复制]

    这个问题在这里已经有答案了 如何制作一个这样的文本框 我想所有的用户都见过这个并且知道它的功能 您可以使用带有 Mask 的 MaskedTestBox000 000 000 000 欲了解更多信息 请参阅文档 http msdn micr
  • 如何区分用户点击链接和页面自动重定向?

    拥有 C WebBrowser control http msdn microsoft com en us library system windows forms webbrowser aspx在我的 WinForms 应用程序中 并意识
  • 获取两个工作日之间的天数差异

    这听起来很简单 但我不明白其中的意义 那么获取两次之间的天数的最简单方法是什么DayOfWeeks当第一个是起点时 如果下一个工作日较早 则应考虑在下周 The DayOfWeek 枚举 http 20 20 5B1 5D 3a 20htt
  • 在 Visual Studio 2010 中从 Fortran 调用 C++ 函数

    我想从 Fortran 调用 C 函数 为此 我在 Visual Studio 2010 中创建了一个 FORTRAN 项目 之后 我将一个 Cpp 项目添加到该 FORTRAN 项目中 当我要构建程序时出现以下错误 Error 1 unr
  • 我可以使用 moq Mock 来模拟类而不是接口吗?

    正在经历https github com Moq moq4 wiki Quickstart https github com Moq moq4 wiki Quickstart 我看到它 Mock 一个接口 我的遗留代码中有一个没有接口的类
  • DbContext 和 ObjectContext 有什么区别

    From MSDN 表示工作单元和存储库模式的组合 使您能够查询数据库并将更改分组在一起 然后将这些更改作为一个单元写回存储 DbContext在概念上类似于ObjectContext 我虽然DbContext只处理与数据库的连接以及针对数
  • 如何检测表单的任何控件的变化?

    如何检测 C 中表单的任何控件的更改 由于我在一个表单上有许多控件 并且如果表单中的任何控件值发生更改 我需要禁用按钮 我正在寻找一些内置函数 事件处理程序 属性 并且不想为此创建自定义函数 不 我不知道任何时候都会触发任何事件any控制表
  • 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?

    我有一个可在 32 位和 64 位处理器上运行的 C 应用程序 我试图枚举给定系统上所有进程的模块 当尝试从 64 位应用程序枚举 32 位进程模块时 这会出现问题 Windows 或 NET 禁止它 我认为如果我可以从应用程序内部重新启动
  • Azure 辅助角色“请求输入之一超出范围”的内部异常。

    我在辅助角色中调用 CloudTableClient CreateTableIfNotExist 方法 但收到一个异常 其中包含 请求输入之一超出范围 的内部异常 我做了一些研究 发现这是由于将表命名为非法表名引起的 但是 我尝试为我的表命
  • C# 中的合并运算符?

    我想我记得看到过类似的东西 三元运算符 http msdn microsoft com en us library ty67wk28 28VS 80 29 aspx在 C 中 它只有两部分 如果变量值不为空 则返回变量值 如果为空 则返回默
  • CMake 无法确定目标的链接器语言

    首先 我查看了this https stackoverflow com questions 11801186 cmake unable to determine linker language with c发帖并找不到解决我的问题的方法 我
  • “接口”类似于 boost::bind 的语义

    我希望能够将 Java 的接口语义与 C 结合起来 起初 我用过boost signal为给定事件回调显式注册的成员函数 这非常有效 但后来我发现一些函数回调池是相关的 因此将它们抽象出来并立即注册所有实例的相关回调是有意义的 但我了解到的
  • Oracle Data Provider for .NET 不支持 Oracle 19.0.48.0.0

    我们刚刚升级到 Oracle 19c 19 3 0 所有应用程序都停止工作并出现以下错误消息 Oracle Data Provider for NET 不支持 Oracle 19 0 48 0 0 我将 Oracle ManagedData

随机推荐

  • JPA/Hibernate 有条件一对多关系?

    我正在使用 Hibernate Tools 直接从数据库生成 DAO 和类 数据库中有两张表 表A和B A到B之间存在一对多关系 B中的多行映射到单个A 在A A类 的生成代码中 有B类的集合 体现了一对多的关系 但是 我不需要 B 中属于
  • 从 ejs 模板生成静态 HTML 文件

    好的 我已经启动并运行了我的基本 Nodejs 网站 这一切都正常工作并通过节点服务器运行 使用我的基本节点站点 https github com andrewbrandwood node basic site 它使用 ejs 作为模板引擎
  • Java 中内存分配的典型速度是多少?

    我正在分析一个 Java 应用程序 发现对象分配的速度比我预期的要慢得多 我运行了一个简单的基准测试来尝试确定小对象分配的整体速度 我发现在我的机器上分配一个小对象 3 个浮点数的向量 似乎需要大约 200 纳秒 我在 双核 2 0 GHz
  • Json.NET:反序列化嵌套字典

    将对象反序列化为Dictionary JsonConvert DeserializeObject
  • openerp中的父左和父右

    什么是父左和父右 它是如何运作的Openerp Thanks 正如拉斐尔 科莱 Raphael Collet 所解释的那样他关于 OpenERP Server 的回答 https answers launchpad net openobje
  • 如何使用 WebStorm 进行 Chrome 扩展开发?

    我刚刚购买了 WebStorm 5 到目前为止一直非常喜欢它的检查功能 我在开发 Chrome 扩展程序时遇到的一个问题是它无法识别chrome多变的 有什么办法可以添加chrome变量到检查器以便它可以在我键入时自动完成 我猜我需要添加
  • SurfaceTexture updateTexImage 共享 2 个 EGLContext - Android 4.4 上的问题

    我指的是这个关于如何将相机的预览帧直接编码到 mp4 文件中的优秀示例 http bigflake com mediacodec CameraToMpegTest java txt http bigflake com mediacodec
  • 这不知何故冻结了我的整个程序,我不确定为什么?

    所以我在线程上运行所有内容run and not run按预期工作 但是running不打印 我尝试调用它 status text Working print run process 但这只会冻结我的整个程序 我也尝试放入root afte
  • 如何在SAPUI5中自定义Shell容器[重复]

    这个问题在这里已经有答案了 我有一个外壳容器 在大屏幕上我想充分利用屏幕 我想覆盖整个区域 我如何定制它 我假设您正在使用 XML 来表达您的观点 添加以下属性appWidthLimited false 到 Shell 标签
  • 如何从我的位置在 Google Maps API V2 中绘制路线 [重复]

    这个问题在这里已经有答案了 我想进行方向应用 但是 我在绘制从我的位置到目的地的路线时遇到问题 我从我的位置获取变量经度和纬度 但我不知道画线 我想绘制到该位置的方向 6 984873352070259 108 48140716552734
  • 从 MediaStream 对象获取媒体详细信息(分辨率和帧速率)

    我正在捕获用户的相机 我想以尽可能最佳的分辨率捕获图片 所以我的代码类似于下面的代码片段 我想从传入流中读取分辨率详细信息 因此我可以将其设置为视频高度和宽度 我将用它来单击快照 我希望快照具有流提供的最佳质量 这可能吗 读取分辨率详细信息
  • “粗箭头”(=>)何时绑定到“this”实例

    粗箭头可以在不同的设置中使用 但不知何故却不能 始终绑定到我想要的实例 粗箭头绑定3次 声明方法时 在方法内声明函数时 在全局上下文中声明函数时 1 声明方法时 当 Coffeescript 编译器遇到以下语法模式时 在类声明中 class
  • 在单个文件中重新启动/撤消冲突解决方案

    在具有多个冲突文件的较大 git 合并中 我错误地将文件标记为已解决 使用git add FILE经过一些编辑 现在我想撤消冲突解决尝试并重新开始解决该文件 我怎样才能做到这一点 在这里找到了解决方案 http gitster livejo
  • 使用 valueForKeyPath 获取数组元素

    有什么办法可以访问NSArray元素与valueForKeyPath 例如 谷歌的反向地理编码服务返回非常复杂的数据结构 如果我想获取城市 现在我必须将其分成两个调用 如下所示 NSDictionary address NSString s
  • 计算 PHP echo 表中的出现次数

    我是 PHP 和 MySQL 的新手 虽然 StackOverflow 上有很多这方面的示例 但它们都不太适合我的情况 所以 我有一张表 名为votes 看起来像这样 student name student id teacher Joe
  • 解释重构[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Question 我的问题是如何教授整理和重构代码的方法和重要性 背景 我最近正在为一位同事进行代码审查 他们对早已消失的同事工作做了一些
  • 如何在 UIlabel 中显示阿拉伯语文本

    我从服务器得到这个字符串作为响应 它实际上是阿拉伯语 1606 1585 1610 1583 1571 1606 1606 1585 1609 1607 1584 1575 1601 1610 1575 1604 1604 1594 157
  • 展平 Scala Spark Dataframe 中的嵌套 json

    我有多个来自任何restapi 的json 但我不知道它的架构 我无法使用 dataframes 的爆炸功能 因为我不知道由 Spark api 创建的列名称 1 我们可以通过解码值来存储嵌套数组元素的键吗dataframe schema
  • Firefox 中的 Ctrl+r 用于刷新页面和我的 php 代码

    我创建了一个表单 所以它是 PHP 和 HTML 混合代码 它有能力发送 POST 当我单击它时 它可以完美地发送和显示输入 But there s something happening when i click Ctrl R in fi
  • OpenCV CUDA Morphology 比 CPU 慢得多

    我正在处理维度图像2208x1242来自 while 循环中的视频 使用 C 和 OpenCV 为了加快速度 我想在 Nvidia Jetson Nano 的 GPU 上执行操作 对于从 BGR 到 HSV 的颜色转换 使用cv cuda