【问题标题】:Getting corners from convex points从凸点获取角
【发布时间】:2012-04-21 17:48:34
【问题描述】:

我已经编写了算法来提取图像中显示的点。它们形成凸形,我知道它们的顺序。如何从这些点中提取角(前 3 个和后 3 个)? 我正在使用opencv。

【问题讨论】:

    标签: opencv computer-vision edge-detection


    【解决方案1】:

    如果您已经有了对象的凸包,并且该包包括角点,那么您需要做的就是简化包,直到它只有 6 个点。

    有很多方法可以简化多边形,例如你可以使用这个答案中使用的简单算法:How to find corner coordinates of a rectangle in an image

    do
       for each point P on the convex hull: 
           measure its distance to the line AB _ 
           between the point A before P and the point B after P, 
       remove the point with the smallest distance 
    repeat until 6 points left
    

    如果您不知道确切的点数,那么您可以删除点直到最小距离超过某个阈值

    你也可以用Ramer-Douglas-Peucker 来简化多边形,openCV 已经在cv::approxPolyDP 中实现了。

    只需修改 the openCV squares sample 以使用 6 点而不是 4 点

    【讨论】:

    • 太棒了!我尝试了您提出的解决方案,并且效果很好!我还将研究一下 Ramer 算法。
    • Ramer-Douglas-Peucker 算法有很多用途。很高兴 HugoRune 提出了建议。如果您修改它,请务必举例说明设置不同 epsilon 值的效果。找到漂亮的方形角或不规则角的另一种选择是计算沿轮廓的两点之间的距离与通过图形的这两点之间的距离的比率。对于直线上的点,比例为 1:1。
    【解决方案2】:

    与其尝试直接确定哪些特征点对应于角点,不如对整个图像应用角点检测算法,然后在角点检测器中寻找哪些特征点出现在峰值附近?

    我建议从Harris corner detector 开始。 OpenCV 的实现是cv::cornerHarris

    本质上,Harris 算法将水平和垂直Sobel filter 应用于图像(或图像在 x 和 y 方向上的偏导数的其他近似值)。

    然后它在每个图像像素处构造一个 2 x 2 structure 矩阵,查看该矩阵的特征值,如果两个特征值都高于某个阈值,则调用点角。

    【讨论】:

    猜你喜欢
    • 2013-05-26
    • 2016-01-02
    • 1970-01-01
    • 2013-07-11
    • 2015-06-16
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多