【发布时间】:2012-04-21 17:48:34
【问题描述】:
我已经编写了算法来提取图像中显示的点。它们形成凸形,我知道它们的顺序。如何从这些点中提取角(前 3 个和后 3 个)? 我正在使用opencv。
【问题讨论】:
标签: opencv computer-vision edge-detection
我已经编写了算法来提取图像中显示的点。它们形成凸形,我知道它们的顺序。如何从这些点中提取角(前 3 个和后 3 个)? 我正在使用opencv。
【问题讨论】:
标签: opencv computer-vision edge-detection
如果您已经有了对象的凸包,并且该包包括角点,那么您需要做的就是简化包,直到它只有 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 点
【讨论】:
与其尝试直接确定哪些特征点对应于角点,不如对整个图像应用角点检测算法,然后在角点检测器中寻找哪些特征点出现在峰值附近?
我建议从Harris corner detector 开始。 OpenCV 的实现是cv::cornerHarris。
本质上,Harris 算法将水平和垂直Sobel filter 应用于图像(或图像在 x 和 y 方向上的偏导数的其他近似值)。
然后它在每个图像像素处构造一个 2 x 2 structure 矩阵,查看该矩阵的特征值,如果两个特征值都高于某个阈值,则调用点角。
【讨论】: