在 OpenCV 中查找轮廓的“fitLine”

2024-01-02

我是一个在流中查找轮廓的程序,例如:

我想找到可以描述这个轮廓的“点集”,就像红线一样:

黄色部分是轮廓的矩,

我尝试使用fitLineopencv 的函数,但结果是无意义的,任何想法如何获得轮廓的中线,这应该代表我的 Contours 的关键方面。顺便说一句 **我不是要代码! ** 只是一个提示我该怎么做?

预先感谢您的帮助


也许可以尝试使用距离变换和脊检测这种方法:

cv::Mat input = cv::imread("fitLine.jpg");
cv::Mat gray;
cv::cvtColor(input,gray,CV_BGR2GRAY);

cv::Mat mask = gray>100;
cv::imshow("mask",mask);

cv::Mat dt;
cv::distanceTransform(mask,dt,CV_DIST_L1,CV_DIST_MASK_PRECISE);

cv::imshow("dt", dt/15.0f);
cv::imwrite("fitLineOut.png",255*dt/15.0f);


//care: this part doesn't work for diagonal lines, a ridge detection would be better!!
cv::Mat lines = cv::Mat::zeros(input.rows, input.cols, CV_8UC1);
//only take the maxDist of each row
for(unsigned int y=0; y<dt.rows; ++y)
{
    float biggestDist = 0;
    cv::Point2i biggestDistLoc(0,0);
    for(unsigned int x=0; x<dt.cols; ++x)
    {
        cv::Point2i current(x,y);
        if(dt.at<float>(current) > biggestDist)
        {
            biggestDist = dt.at<float>(current) ;
            biggestDistLoc = current;

        }
    }
    lines.at<unsigned char>(biggestDistLoc) = 255;
}

//and the maxDist of each row
for(unsigned int x=0; x<dt.cols; ++x)
{
    float biggestDist = 0;
    cv::Point2i biggestDistLoc(0,0);
    for(unsigned int y=0; y<dt.rows; ++y)
    {
        cv::Point2i current(x,y);
        if(dt.at<float>(current) > biggestDist)
        {
            biggestDist = dt.at<float>(current) ;
            biggestDistLoc = current;

        }
    }
    lines.at<unsigned char>(biggestDistLoc) = 255;
}

cv::imshow("max", lines);


cv::waitKey(-1);

这个想法是计算距离变换并找到轮廓内的脊。

this is how the distance transformed image looks like: enter image description here you can see that there is a local ridge maximum in the middle of the lines.

然后我使用一个非常简单的方法:只需找到每行/列中的最大距离。这是非常草率的,应该改变为真正的脊检测或细化方法!!!!

edit:补充说明:

这个想法是找到轮廓“中间”的所有点。在数学/图形中,中轴位于物体的某种“中间”,它的定义是同时到至少两个轮廓点具有相同最小距离的所有点。

近似中轴的一种方法是计算距离变换。距离变换是一个矩阵,它保存每个像素到下一个对象点(例如对象的轮廓)的距离(请参阅http://en.wikipedia.org/wiki/Distance_transform http://en.wikipedia.org/wiki/Distance_transform也)。这是第一张图片。在那里,您可以看到线条中间的点比靠近边界的点稍微亮一点,这意味着线条上最亮的点可以解释为中轴(近似值),因为如果您移动远离它(与线方向正交),距离变小,因此峰值是到两个边界的距离接近相等的点。

这样,如果您可以在距离变换中找到那些“脊”,那么您就完成了。 脊线检测通常由 Harris 操作员完成(参见http://en.wikipedia.org/wiki/Ridge_detection http://en.wikipedia.org/wiki/Ridge_detection ).

在我发布的快速而肮脏的版本中,我尝试通过仅接受每行和每行中的最大值来检测山脊。这对于大多数水平和垂直的山脊来说是可以的,但对于对角的山脊来说就不行了。所以也许你真的想交换for loops with a real ridge detection.

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

在 OpenCV 中查找轮廓的“fitLine” 的相关文章

  • 比较两个直方图

    对于一个小型项目 我需要将一张图像与另一张图像进行比较 以确定图像是否大致相同 这些图像很小 宽度从 25 到 100 像素不等 这些图像应该具有相同的图片数据 但略有不同 因此简单的像素相等检查不起作用 考虑以下两种可能的情况 博物馆中的
  • Monitor.Pulse & Wait - 意外行为

    http www codeproject com Articles 28785 Thread synchronization Wait and Pulse demystified http www codeproject com Artic
  • 提取单花括号内的值

    我想要一个收藏 value 一个字符串使用正则表达式 例如 lorem ipsum field1 lorem ipsum field2 lorem ipsum field1 lorem ipsum field2 field3 我会得到 fi
  • .NET 中的 Class.forName() 等效项?

    动态获取对象类型然后创建它的新实例的 C 方法是什么 例如 如何在 C 中实现以下 Java 代码的结果 MyClass x MyClass Class forName classes MyChildClass newInstance Lo
  • C 中的 '\0' 和 printf()

    在 C 入门课程中 我了解到在存储字符串时存储空字符 0在它的最后 但是如果我想打印一个字符串怎么办 printf hello 虽然我发现它并没有结束 0通过以下声明 printf d printf hello Output 5 但这似乎不
  • 析构函数与成员函数竞赛

    当我在析构函数内时 其他线程是否可能开始执行对象的成员函数 遇到这种情况该如何处理呢 C 没有内在的保护来防止在删除对象后使用它 忘记竞争条件 另一个线程可以在完全删除你的对象后使用你的对象 Either 确保只有一个位置 代码拥有该对象
  • C 链表销毁函数

    我正在尝试学习 C 和很多人一样 我对指针有点困惑 无论如何 我创建了一个递归函数来销毁我的链表 但是正如我调试的那样 当我从函数返回时 列表的头部不应该为空 所以我猜这是对指针的一些基本误解 这是函数 void destroy struc
  • HTC One M8 - 使用第二个后置摄像头

    我有一台 HTC One M8 设备 它有 2 个后置摄像头和一个额外的前置摄像头 我的问题是尝试访问第二个后置摄像头 我已经成功制作了一个应用程序 它同时运行 2 个摄像头 1 个前置摄像头和 1 个后置摄像头 但问题是我无法访问第二个后
  • 将 std::pair const 转换为 std::pair const 安全吗?

    理论上或实践上 安全吗reinterpret cast a std pair
  • Web浏览器控件:如何捕获文档事件?

    我正在使用 WPF 的 WebBrowser 控件加载一个简单的网页 在这个页面上我有一个锚点或一个按钮 我想在我的应用程序后面的代码中 即在 C 中 捕获该按钮的单击事件 WebBrowser 控件是否有办法捕获加载页面元素上的单击事件
  • 编译器消息“警告:格式‘%s’需要类型‘char *’,但参数 2 具有类型‘char (*)’”

    我正在尝试运行一个简单的 C 程序 但收到此错误 警告 格式 s 需要类型 char 但参数 2 的类型为 char 20 我在跑步Mac OS X v10 8 https en wikipedia org wiki OS X Mounta
  • 是否自初始化 'A a = a;'允许吗?

    此代码在运行时在复制构造函数中失败 但编译器 MSVS2008 没有发出警告 您能解释一下 最好引用标准 这段代码是否非法或什么 我理解 A a a 永远不应该写在第一位 但我正在寻找理论背景 class A public A p new
  • 在 Linq 查询中使用动态列名称

    foreach Dimension dimensions in Enum GetValues typeof Dimension var r new ReferenceTable dimensions referenceItems List
  • 如何解析多态 JSON 数组?

    我有一个 JSON 格式的文件 其中包含个人用户的记录 一些用户的记录中间有一个评论字段 我只想解析顶级项目 全名 贡献者姓名 电子邮件 使用 Newtonsoft JSON 解析器 但我似乎无法让它识别单个对象 当我将整个字符串解析为一个
  • 使用信号和槽更新指针

    我对 Qt 很陌生 请帮我解决这个问题 我正在使用线程在后台执行密集操作 同时我想更新 UI 所以我使用 SIGNALS 和 SLOTS 为了更新 UI 我发出一个信号并更新 UI 让我们考虑下面的示例代码 struct sample QS
  • WCF 服务中的缓冲区大小

    我们有一个 WCF 服务 它执行某些存储过程并将结果返回给 silverlight 客户端 某些存储过程最多返回 80K 行 下面给出的是 web config 中服务的设置
  • 如何在 stl 模板中使用导出类 (__declspec(dllexport))?

    我正在使用导出的类 class declspec dllexport myclass private template declspec dllexport class std map
  • NSubstitute - 测试特定的 linq 表达式

    我在当前正在开发的 MVC 3 应用程序中使用存储库模式 我的存储库界面如下所示 public interface IRepository
  • Membership.ValidateUser() 的目的是什么

    我一直在学习有关MembershipProvider类 我认为Membership ValidateUser 方法应该用于登录用户 然而我刚刚了解到有一个FormsAuthentication Authenticate 目的是什么Valid
  • 小数精度

    我使用小数类型进行高精度计算 货币 但我今天遇到了这个简单的划分 1 1 37 这应该再次得到 37 http www wolframalpha com input i 1 2F 281 2F37 29 http www wolframal

随机推荐

  • 将我的登录凭据存储在 redux-react 中

    我想将我的登录凭据存储在 redux react 中 我附加了几行代码 问题的一部分 sksignup js import React Component from react import useState from react impo
  • 大虾PDF-如何获取文本框的高度

    我有一个包含动态文本的 formatted text box 当没有给出具体尺寸时 盒子似乎可以很好地扩展 问题是它似乎没有将光标移动到框的底部 因此我的文本与 formatted text box 中的文本重叠 如果我可以确定文本框的高度
  • AlarmManager Android 日常

    我正在尝试制定一个时间表 它应该每天下午 1 点或 2 点运行 目前我只能让它每 10 秒或 10 分钟运行一次 Intent myIntent new Intent AndroidAlarmService this MyAlarmServ
  • 以编程方式生成请求验证令牌

    从一个空的 MVC 项目开始 这是我的Startup cs using Microsoft AspNetCore Builder using Microsoft AspNetCore Hosting using Microsoft Exte
  • Couchbase 文档日期搜索 - DateTime.Now()

    我在 CB 中有一份文档 其中有两个日期 开始日期和结束日期 比方说 产品的价格折扣 10 折扣从今天开始到下周五结束 我怎样才能从CB获得今天有有效折扣的所有文件 我做了一个视图 其中包含以下内容 var dt new Date 得到今天
  • Richardson-Lucy 反卷积可以恢复潜在内核吗?

    我知道理查森 露西反卷积是为了恢复潜在图像 但假设我们有一个噪声图像和原始图像 我们能找到引起转变的内核吗 下面是一个 MATLAB 代码理查森 露西反卷积 http en wikipedia org wiki Richardson E2
  • OS X Server + GIT 与 SSH 集成失败并出现权限被拒绝错误

    我的 GIT 服务器托管在单独的 Linux 服务器上 我有 SSH RSA 密钥没有密码 我能够使用 Xcode 连接到 GIT 服务器 并且所有操作都可以通过 Xcode 5 0 2 在源代码管理中正常工作 我在本地计算机上安装了 OS
  • 为什么 String.length() 是一个方法?

    如果 String 对象是不可变的 因此显然不能改变它的长度 为什么length 一种方法 而不是简单地public final int length比如数组中有什么 它只是一个 getter 方法 还是进行某种计算 只是想看看这背后的逻辑
  • Apple 如何查找电子邮件中的日期、时间和地址?

    在 iOS 电子邮件客户端中 当电子邮件包含日期 时间或位置时 文本将成为超链接 只需点击链接即可创建约会或查看地图 它不仅适用于英语电子邮件 也适用于其他语言 我喜欢这个功能 并且想了解他们是如何做到的 最简单的方法是使用许多正则表达式并
  • EF6 急切加载相关实体的单个属性

    在 EF6 中 我有一个实体客户 具有实体地址的导航属性 地址实体包含属性 城市 我可以急切地加载地址实体 同时获取所有客户 如下所示 dbSet Customers Include customer gt customer Address
  • 从 HttpWebRequest 下载时缺少某些元素?

    我正在使用 httpwebrequest 从给定的 url 下载数据 但很少有元素没有响应 Dim Request As HttpWebRequest CType WebRequest Create https www royalmail
  • 如何使InnoDB表在服务器重启时不重置自动增量?

    我的开发机器上运行的是 MySQL 5 5 37 我使用 innodb 表 面临下一个问题 服务器重新启动后自动增量重置 Found 自动锁模式 http dev mysql com doc refman 5 1 en innodb par
  • Twitter Open Graph 图像未显示

    我正在尝试在网站中实现 OpenGraph 这是我的元数据代码
  • Laravel 方法分页不存在

    我正在尝试对模型结果进行分页 但收到 分页方法不存在 这是我的代码 user dispatches Dispatch all gt where user id Auth id gt paginate 10 我需要获取用户 ID 等于当前经过
  • 我可以在 Three.js 中隐藏网格的面吗?

    我想使网格的某些部分在运行时不可见 我可以将这些部分设置为不可见 透明吗 通过改变单个面孔的属性 网格本身仅使用一种材料 示例说明 as the editor理解这个问题 想象一个网格 这里有 20 个顶点的几何图形 其中每个四个顶点的四边
  • DSPack - 如何获取声音输出的默认设备?

    在 Windows 7 中 有多个播放设备 示例 在我的笔记本电脑上 扬声器和双耳机 独立双耳机 SPDIF 通过 HP Dock 进行数字输出 情况是这样的 我正在编写一个应用程序 让用户选择输出设备并将其保存到应用程序的设置中 因此 它
  • Java 相当于 Cocoa 委托/Objective-C 非正式协议?

    Java 中 Cocoa 委托的等价物是什么 我知道我可以将一个接口传递给一个类 并让该类调用适当的方法 但我想知道是否有其他方法可以实现更接近 Cocoa Objective C 的非正式协议的东西 简而言之 Java 中没有任何东西能像
  • 如何在 Visual Studio 2013 中创建数据库项目

    我正在将包含一些 C 项目的解决方案从 Visual Studio 2008 迁移到 VS2013 迁移进行得很顺利 进行了一些调整 但是还有一个 dbp 项目 数据库项目 来自 VS2008 它拒绝在 VS2013 中迁移 加载 我在这个
  • 为什么通过 newCachedThreadPool 创建的 ExecutorService 是邪恶的?

    保罗 泰玛推介会 http paultyma blogspot com 2008 03 writing java multithreaded servers html有这一行 Executors newCachedThreadPool万恶
  • 在 OpenCV 中查找轮廓的“fitLine”

    我是一个在流中查找轮廓的程序 例如 我想找到可以描述这个轮廓的 点集 就像红线一样 黄色部分是轮廓的矩 我尝试使用fitLineopencv 的函数 但结果是无意义的 任何想法如何获得轮廓的中线 这应该代表我的 Contours 的关键方面