在 OpenCV 中绘制梯度向量场

2024-01-22

我想计算灰度图像的梯度(平滑平面在代码中)并将其绘制为 OpenCV 中的矢量场,叠加到现有图像上。

我尝试应用一对 Sobel 运算符(我也尝试过 Scharr)来计算沿 x 和 y 的两个导数,如 OpenCV 文档中所述,但当我尝试绘图时,矢量场似乎完全错误。我想了解我的错误是什么。

我在这里放了一些代码以便更清楚。在此先感谢您的帮助。

//img is a gray-scale image
Mat abs_grad_x, abs_grad_y, grad;
Mat g_img;
int ddepth = CV_16S;
int scale = 1;
int delta = 0;    

cvtColor(img,g_img,CV_GRAY2BGR);


smoothed_plane = Mat::zeros(image_height,image_width,CV_8UC1);
gradient_field = Mat::zeros(image_height,image_width,CV_32FC2);

// Smooth the dominant plane by convolution with a Gaussian
GaussianBlur(dominant_plane,smoothed_plane,Size(51,51),image_height*image_width*0.5);

/// Morphological opening (remove small objects from the foreground)
erode(smoothed_plane, smoothed_plane, getStructuringElement(MORPH_ELLIPSE, Size(40+1,40+1)));
dilate(smoothed_plane, smoothed_plane, getStructuringElement(MORPH_ELLIPSE, Size(40, 40)));
/// Morphological closing (fill small holes in the foreground)
dilate(smoothed_plane, smoothed_plane, getStructuringElement(MORPH_ELLIPSE, Size(40, 40)));
erode(smoothed_plane, smoothed_plane, getStructuringElement(MORPH_ELLIPSE, Size(40, 40)));

imshow("Eroded plane",smoothed_plane);

/// Gradient X
Scharr( smoothed_plane, grad_x, ddepth, 1, 0, scale, delta, BORDER_DEFAULT );
convertScaleAbs( grad_x, abs_grad_x );

/// Gradient Y
Scharr( smoothed_plane, grad_y, ddepth, 0, 1, scale, delta, BORDER_DEFAULT );
convertScaleAbs( grad_y, abs_grad_y );

for (int i = 0 ; i < image_height ; i ++){
    for (int j = 0 ; j < image_width ; j ++){
        gradient_field.at<Point2f>(Point2f(j,i)) = Point2f(abs_grad_x.at<float>(Point2f(j,i)),abs_grad_y.at<float>(Point2f(j,i)));
    }
}

for (int i = 0 ; i < image_height ; i += flowResolution){
    for (int j = 0 ; j < image_width ; j+= flowResolution){
        Point2f p(j,i);
        Point2f p2(gradient_field.at<Point2f>(p)+p);
        arrowedLine(g_img,p,p2,Scalar(0,0,255),1.5,8,0,0.1);
    }
}//*/

imshow("Gradient Vector Field", g_img);

EDIT:

这是我的输入/输出结果的一对帧,根据需要

我尝试打印出一些值,在某些点上我得到了非常高或非常低的值。 再次感谢


我解决了我的问题。主要错误在于偏导数矩阵的访问方法,grad_x and grad_y。如上所述here http://docs.opencv.org/doc/user_guide/ug_mat.html, 方法在.()返回一个Scalar对象,因此要访问像素强度值,应该使用.val[]场地。这就是代码必须更改的方式:

Scharr(smoothed_plane,grad_x,ddepth,1,0,scale);
Scharr(smoothed_plane,grad_y,ddepth,0,1,scale);

for (int i = 0 ; i < image_height ; i ++){
    for (int j = 0 ; j < image_width ; j ++){
        Scalar xval = grad_x.at<float>(i,j);
        Scalar yval = grad_y.at<float>(i,j);
        gradient_field.at<Point2f>(i,j) = Point2f(xval.val[0],yval.val[0]);
    }
}

and this is the expected result: enter image description here

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

在 OpenCV 中绘制梯度向量场 的相关文章

  • Windows 10 Mobile (10.0.14393) 地理围栏后台任务 (LocationTrigger)

    自从10 0 14393 周年纪念更新 LocationTrigger似乎不起作用 我有 Windows Phone 8 1 应用程序 也适用于 UWP 应用程序 输出到的便携式库Windows Runtime Component图书馆 w
  • 为什么存在 async 关键字

    浏览 msdn 9 频道视频时 我发现以下未答复的评论 希望有人能解释一下 我不明白 async 关键字的意义 为什么不直接允许 任何时候方法返回任务时都会使用await关键字 就像迭代器一样 可以在任何返回 IEnumerable 的方法
  • 在 VS2017 下使用 Conan 和 CMake 项目进行依赖管理

    我正在尝试使用 CMake 与 VS2017 集成为 C 设置一个开发环境 以便在 Linux x64 下进行编译 为了更好地管理依赖关系 我选择使用 Conan 但我对这个软件还很陌生 我想知道让 VS2017 识别项目依赖关系的最佳方法
  • 如何使用 zlib 制作 .zip 文件

    我正在阅读zlib的文档 它相当详细 但我读到了这一行 输出数据将位于zlib格式 与 gzip 或zip formats http www zlib net zlib how html http www zlib net zlib how
  • 内联函数/方法

    声明 内联函数必须在调用之前定义 这个说法正确吗 EDIT 该问题最初是德语 内联功能穆森 弗 伊赫雷姆 奥夫鲁夫定义 sein 也许它对任何人都有帮助 是的 它是正确的 但只是部分正确 它可能正确地重新构建如下 内联函数必须在每个翻译单位
  • ASP.NET Core 与现有的 IoC 容器和环境?

    我想运行ASP NET 核心网络堆栈以及MVC在已托管现有应用程序的 Windows 服务环境中 以便为其提供前端 该应用程序使用 Autofac 来处理 DI 问题 这很好 因为它已经有一个扩展Microsoft Extensions D
  • 为什么Apache MPM prefork.c 使用互斥体来保护accept()?

    我坐下来读书Apache 的 MPM prefork c http code metager de source xref apache httpd server mpm prefork prefork c这段代码使用了一个名为accept
  • 如何尝试/捕获所有异常

    我正在完成由其他人启动的 UWP 应用程序 该应用程序经常崩溃 我总是陷入困境应用程序 at if global System Diagnostics Debugger IsAttached global System Diagnostic
  • 在 C# Winforms 应用程序中嵌入 Windows XP 主题

    我有一个旧版 C Windows 窗体应用程序 其布局是根据 Windows XP 默认主题设计的 由于需要将其作为 Citrix 应用程序进行分发 该应用程序现在看起来像经典主题应用程序 因为 Citrix 不鼓励使用主题系统服务 所以
  • 如何生成 appsettings..json 文件?

    我有一个 ASP NET Core 2 WebAPI 它将部署在以下环境中 INT QA STAGE 生产环境 基于上述 我需要有appsettings
  • 无法解析远程名称 - webclient

    我面临这个错误 The remote name could not be resolved russgates85 001 site1 smarterasp net 当我请求使用 Web 客户端读取 html 内容时 出现错误 下面是我的代
  • 将带有 glut 的点击坐标添加到向量链接列表中

    我想创建一个向量链接列表 并在 GLUT 库的帮助下获取点击的位置并将它们附加到链接列表中 这些是我写的结构 typedef struct vector int x int y Vector typedef struct VectorLis
  • 两种类型的回发事件

    1 我发现了两篇文章 每篇文章对两种类型的回发事件的分类都略有不同 一位资源说两种类型的回发事件是Changed事件 其中控件实现 IPostbackDataHandler 当数据在回发之间更改时触发 然后Raised事件 其中控件实现 I
  • libxml2 xmlChar * 到 std::wstring

    libxml2似乎将所有字符串存储在 UTF 8 中 如xmlChar xmlChar This is a basic byte in an UTF 8 encoded string It s unsigned allowing to pi
  • OpenCV 2.4.3 中的阴影去除

    我正在使用 OpenCV 2 4 3 最新版本 使用内置的视频流检测前景GMG http docs opencv org modules gpu doc video html highlight gmg gpu 3a 3aGMG GPU算法
  • C++11 动态线程池

    最近 我一直在尝试寻找一个用于线程并发任务的库 理想情况下 是一个在线程上调用函数的简单接口 任何时候都有 n 个线程 有些线程比其他线程完成得更快 并且到达的时间不同 首先我尝试了 Rx 它在 C 中非常棒 我还研究了 Blocks 和
  • 从 R 到 C 处理列表并访问它

    我想使用从 R 获得的 C 列表 我意识到这个问题与此非常相似 使用 call 在 R 和 C 之间传递数据帧 https stackoverflow com questions 6658168 passing a data frame f
  • DataTable:通过 LINQ 或 LAMBDA 进行动态 Group By 表达式

    我有一个数据表 我想在其中对未指定数量的字段进行分组 发生这种情况的原因是用户可以选择他想要分组的字段 所以 实际上 我将选择推入列表中 在这个选择上 我必须对我的数据表进行分组 想象一下这段代码 VB 或 C 都一样 public voi
  • C#中为线程指定特殊的cpu

    我有 2 个线程 我想告诉其中一个在第一个 cpu 上运行 第二个在第二个 cpu 上运行 例如在具有两个 cpu 的机器中 我怎样才能做到这一点 这是我的代码 UCI UCIMain new UCI Thread UCIThread ne
  • 如何使用 C# 以低分辨率形式提供高分辨率图像

    尝试使用 300dpi tif 图像在网络上显示 目前 当用户上传图像时 我正在动态创建缩略图 如果创建的页面引用宽度为 500x500px 的高分辨率图像 我可以使用相同的功能即时转换为 gif jpg 吗 将创建的 jpg 的即将分辨率

随机推荐

  • 通过读取另一个文件的内容在 makefile 中创建变量

    如何从 makefile 即时创建变量 其值将是另一个数据文件的全部内容 假设 GNU make file whatever txt variable shell cat file
  • AdapterView的onItemClickListener和OnItemSelectedListener的区别

    这两个听众有什么区别 文档说 OnItemSelectedListener 选择此视图中的项目时调用的回调的接口定义 OnItemClickListener 单击此 AdapterView 中的项目时调用的回调的接口定义 选择 点击在触摸屏
  • Android 谷歌日历授权问题

    我正在尝试制作一个使用 OAuth 访问用户的 Google 日历的应用程序 我已经准备好了获取所有正确令牌的代码 并将它们保存到某些首选项中 我使用了教程here http blog doityourselfandroid com 201
  • 如何使用 powershell 脚本控制窗口的“状态”(最大化、最小化、恢复)?

    我需要能够运行此脚本并使其最大化窗口 如果尚未最大化 如果不是 则恢复窗口 该窗口就是当前活动的窗口 因此无需获取具体信息 但如果您这样做 则可获得奖励积分 8O 我计划通过快捷键激活它 它确实需要在PS v1下运行 我知道 我知道 但我无
  • 无法读取 d3.force 实现中未定义的属性“权重”

    我已经被这个问题困扰了一段时间 甚至根据现有的答案也不知道该怎么做 我在统一响应的最后一个 JSON 条目上不断收到此错误 paperCount 1 PMIDs 20626970 authorA 79 authorB 80 paperCou
  • GraphQL:过滤数组中的数据

    我确信这是一件简单的事情 但我在 GraphQL 的文档或 Graphcool 的文档中找不到任何内容 假设我有一个具有此模式的实体 新的 GraphQL 用户 如果我在模式表示中犯了错误 抱歉 Book name String autho
  • netbeans php插件使用FTP上传文件时如何控制文件权限

    每当 netbeans 执行 ftp 上传时 都会使用设置为 640 的权限上传文件 这会导致 PHP 抛出以下错误 Warning Unknown failed to open stream Permission denied in Un
  • 在不禁用滚动功能的情况下防止 iOS 反弹

    我正在尝试实现一种解决方案 以防止当网页内容大于视口时 iOS 版 Safari 中出现 iOS 反弹效果 我正在处理的页面的结构非常具体 并且与此页面非常相似http new salt ch http new salt ch 基本结构是基
  • 根据文件大小和时间回滚日志

    我一直在尝试建立一个简单的 logback 项目来按日期和文件大小滚动我的日志文件 到目前为止我无法让我的附加程序滚动到另一个文件 相反 它写入由
  • 如何重置Codemirror编辑器?

    我想重置 Codemirror 编辑器的所有内容 理想情况下 这应该清除文本区域 删除所有标记并清除历史记录 实现这一目标的最佳方法是什么 cm setValue cm clearHistory cm clearGutter gutterI
  • 从父类访问属性时未定义的属性

    当类 B 是类 A 的子级并且应该使用 扩展 继承其属性时 我无法弄清楚如何使用类 B 访问类 A 的属性 基本上 我有 class A function construct this gt foo foo class B extends
  • 为什么 sum 的值会变成负数? [复制]

    这个问题在这里已经有答案了 我编写了以下 C 代码来查找给定数组的前 49 个数字的总和 但总和为负数 include
  • 覆盖 Laravel 容器中的 Singleton

    我想知道是否有一种简单的方法来覆盖 Laravel 框架核心中的单例服务集 例如我正在尝试使用以下提供程序重写 app name 命令服务 use Hexavel Console AppNameCommand use Illuminate
  • 如何返回类型列表中最大的类型?

    我将如何创建一个类模板来返回其类型sizeof比其他人都大 例如 typename largest
  • ORA-06530: 对未初始化复合的引用

    当我执行包时 我收到一条错误消息 emp test 中出现错误 ORA 06530 引用未初始化的组合 你能解释一下如何初始化包中的对象类型吗 CREATE OR REPLACE TYPE emp obj AS OBJECT emp no
  • 将一些 C# 通用代码重写为 F#

    我正在尝试重写这样的通用代码 C U Upcast
  • PHP - 使参考参数可选?

    假设我在 PHP 中定义了一个函数 最后一个参数是通过引用传递的 有什么办法可以让它成为可选的吗 我怎么知道它是否已设置 我从未在 PHP 中使用过引用传递 因此下面可能存在一个愚蠢的错误 但这里有一个示例 foo function bar
  • 如何为 C# Windows 服务配置 log4net

    我有一个 Windows 服务 其中 app config 文件和 log4net config 文件是分开的 日志记录不起作用 在我的 app config 文件中 我有以下部分
  • 如何使用mock的@patch来模拟在单独的Python模块中定义的函数

    我正在尝试使用模拟和 patch 装饰器为 Python 应用程序构建测试 给定以下目录结构 mypackage mymodule init py somefile py myothermodule tests init py test f
  • 在 OpenCV 中绘制梯度向量场

    我想计算灰度图像的梯度 平滑平面在代码中 并将其绘制为 OpenCV 中的矢量场 叠加到现有图像上 我尝试应用一对 Sobel 运算符 我也尝试过 Scharr 来计算沿 x 和 y 的两个导数 如 OpenCV 文档中所述 但当我尝试绘图