如何提高轮廓精度?

2024-03-28

我正在做一个使用 OpenCV 的项目。我需要从高清照片中精确地裁剪出一些物体。 我使用四边形树将照片切成碎片,然后计算每个四边形的同质性以确定物体的一部分是否在四边形中。 我根据四边形的同质性应用了一些具有不同阈值的 Canny 滤波器。 我希望这个描述是可以理解的。

该算法适用于某些类型的对象,但我对其他一些对象感到困惑。 这是我的问题的一些例子:我想要一种方法来压平我的轮廓。 第一个屏幕截图是使用 canny 过滤器和洪水填充后的屏幕截图。第二个是最终的掩模结果。

http://pastebin.com/91Pgrd2D http://pastebin.com/91Pgrd2D


为了达到这个结果,我使用cvFindContours()所以我有轮廓,但我找不到一种方法来像我想要的那样处理它们。


也许您可以使用某种平均滤波器来近似曲线,然后使用具有小梯度的 AproxPoly 来平滑它。 这是一个类似的方法:

void AverageFilter(CvSeq * contour, int buff_length)
{
    int n = contour->total, i, j;
    if (n > buff_length)
    {
        CvPoint2D32f* pnt;
        float* sampleX = new float[buff_length];
        float* sampleY = new float[buff_length];

        pnt = (CvPoint2D32f*)cvGetSeqElem(contour, 0);
        for (i = 0; i < buff_length; i++)
        {
            if (i >= buff_length / 2)
            {
                pnt = (CvPoint2D32f*)cvGetSeqElem(contour, i + 1 - buff_length / 2 );
            }
            sampleX[i] = pnt->x;
            sampleY[i] = pnt->y;
        }

        float sumX = 0, sumY = 0;

        for (i = 1; i < n; i++)
        {
            pnt = (CvPoint2D32f*)cvGetSeqElem(contour, i);
            for (j = 0; j < buff_length; j++)
            {
                sumX += sampleX[j];
                sumY += sampleY[j];
            }
            pnt->x = sumX / buff_length;
            pnt->y = sumY / buff_length;
            for (j = 0; j < buff_length - 1; j++)
                {
                    sampleX[j] = sampleX[j+1];
                    sampleY[j] = sampleY[j+1];
                }
            if (i <= (n - buff_length / 2))
            {
                pnt = (CvPoint2D32f*)cvGetSeqElem(contour, i + buff_length / 2 + 1);
                sampleX[buff_length - 1] = pnt->x;
                sampleY[buff_length - 1] = pnt->y;
            }
            sumX = 0;
            sumY = 0;
        }
        delete[] sampleX;
        delete[] sampleY;
    }
} 

您可以为其指定轮廓以及要求平均值的点缓冲区的大小。 如果您认为轮廓太粗,因为一些平均点捆绑在一起太近,那么这就是 Aproxpoly 的用武之地,因为它减少了点的数量。 但要选择合适的渐变,这样就不会显得太前卫。

srcSeq = cvApproxPoly(srcSeq,sizeof(CvContour),storage, CV_POLY_APPROX_DP, x, 1);

尝试使用“x”来看看如何获​​得更好的结果。

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

如何提高轮廓精度? 的相关文章

随机推荐

  • WPF 动画“无法冻结此情节提要时间线树以供跨线程使用”

    我当前有一个列表框 其所选项目绑定到我的 ViewModel 上的属性 每当所选项目不为空时 我想对其执行动画 但是我不断收到以下错误 无法冻结此情节提要时间线树以供跨线程使用 并通过研究了解为什么会发生这种情况 但是我不确定需要采取什么方
  • 如何分组并获取具有 X max 的 Y 列的值? [复制]

    这个问题在这里已经有答案了 我有一个以前从未遇到过的用例 我有以下数据框 并且想要选择 y 的值 其中 x 分别为条件 i 的每个级别实现其最小值和最大值 gt library dplyr gt df lt data frame i c 1
  • 在 ubuntu 20.04 上运行 Tensorflow 时出现“无法加载动态库 'libcudnn.so.8'”

    注意 有很多类似的问题 但是针对不同版本的 ubuntu 和有些不同的特定库 我一直无法弄清楚符号链接 其他环境变量的组合 例如LD LIBRARY PATH会工作 这是我的nvidia配置 nvidia smi Tue Apr 6 11
  • 相当于 dash shell 中的 pipelinefail

    有没有类似的选项dash外壳对应于pipefail in bash 或者如果管道中的命令之一失败 但不退出 则获得非零状态的任何其他方式 set e would 为了更清楚地说明这一点 这是我想要实现的目标的示例 在示例调试 makefil
  • 在 Slack 中合并消息菜单和消息按钮

    我想在我的 Slack 应用程序中结合消息菜单和消息按钮 这是我想要实现的工作流程 1 用户发出斜杠命令来显示菜单 该菜单将有一个下拉菜单和三个按钮 这是我能够实现的 2 我希望用户从下拉列表中选择一个选项 然后按任何操作按钮 然后只应触发
  • Warshall算法思想及改进[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 Warshall Floyd 算法 https en wikipedia org wiki Floyd E2 80 93Warshall a
  • 基于点的线/平面相交

    我在空间中有两个点 L1 和 L2 它们定义了一条线上的两个点 我在空间中有三个点 P1 P2 和 P3 这三个点在平面上 那么给定这些输入 直线在什么点与平面相交 外汇 平面方程 A x B y C z D 0 为 A p1 Y p2 Z
  • 我可以让一个标识字段跨越 SQL Server 中的多个表吗?

    我可以有一个跨多个表的 身份 唯一的 非重复的 列吗 例如 假设我有两个表 书籍和作者 Authors AuthorID AuthorName Books BookID BookTitle BookID 列和AuthorID 列是标识列 我
  • 检测滚动方向

    所以我尝试使用 JavaScripton scroll调用函数 但我想知道是否可以在不使用 jQuery 的情况下检测滚动的方向 如果没有那么有什么解决方法吗 我本来想只放一个 到顶部 按钮 但如果可以的话我想避免这种情况 我现在刚刚尝试使
  • Winsock,仅接受来自特定IP地址的请求

    如何使 Winsock 程序仅接受来自特定地址的连接请求 我希望完全忽略被拒绝的连接 而不是得到 TCP 拒绝 要使 Winsock 程序仅接受来自特定 IP 地址的连接 请使用以下条件接受机制WSAAccept http msdn mic
  • jQuery 事件在 asp.net mvc(4) 第二部分中的部分视图发布后停止工作

    I have a View with the following layout The parent View is composed of several PartialViews One of which is a list where
  • 将 Grails 2.1.1 应用程序部署到 Tomcat 作为爆炸战争?

    我正在尝试在 OpenShift 上部署 Grails 应用程序 并且尝试避免每次更改都在网络上推送 50MB 的文件 我创建了一个项目 dev apps grails test测试它 基于这个答案 https stackoverflow
  • 如何使用批处理文件运行R语言(.r)文件?

    我想使用批处理文件运行 R 脚本文件 r 如果 R exe 在您的 PATH 中 那么您的 Windows 批处理文件 bat 将仅包含一行 R CMD BATCH your r script R 否则 您需要给出 R exe 的路径 例如
  • 为什么 Numba 的“急切编译”会减慢执行速度

    附上一个最小的例子 from numba import jit import numba as nb import numpy as np jit nb float64 nb int32 def go fast a trace 0 0 fo
  • jQuery DataTables 多选列过滤器

    我想要得到的是类似于 Excel 的针对各个 DataTables 列的多条件过滤 我在 stackoverflow 上遇到了一些与该主题相关的主题 但这些主题似乎都没有实现我正在寻找的内容 到目前为止 我只有样本表 我很感激任何有关下一步
  • NGINX 反向代理:许多 html 状态代码 400 响应,为什么?

    我们最近实现了一个基于 nginx 的反向代理 在调试访问日志时 我们看到大量状态代码 400 结果 它们看起来像这样 07 Sep 2011 05 49 04 0700 400 0 我们启用了调试错误日志记录 它们通常对应于这样的内容 2
  • 使用 IHttpHandler 时 Firefox 无法正确处理内容类型

    由于某种原因 Firefox 无法正确处理通过我的 NET HTTP 处理程序发送的内容 它似乎不遵守内容类型标头 相反 它将内容视为 HTML 映射到请求的 URL 甚至具有 csv 扩展名 Internet Explorer 和 Chr
  • Debian:使用 bash 找出 CPU 使用情况

    我正在使用 PHP 来读取当前的 CPU 使用情况 我在虚拟服务器上 因此启用了 shell exec 我努力了grep on ps 但没有成功 如何使用 bash 读取当前的 CPU 使用率百分比 最简单的方法就是使用sys getloa
  • 我们如何使用 JPA2 (Hibernate) 实体作为两个 Web 应用程序之间的 DTO?

    我们在 Glassfish 3 0 1 上运行并使用 Hibernate 3 5 3 我们的项目设置如下所示 前端战争 公共jar 后端战争 我们希望将 jpa2 带注释的实体放入 common jar 中 以便后端将它们视为 JPA2 实
  • 如何提高轮廓精度?

    我正在做一个使用 OpenCV 的项目 我需要从高清照片中精确地裁剪出一些物体 我使用四边形树将照片切成碎片 然后计算每个四边形的同质性以确定物体的一部分是否在四边形中 我根据四边形的同质性应用了一些具有不同阈值的 Canny 滤波器 我希