我正在尝试解决以下问题:给定在二进制blob上找到的轮廓,我想创建一个有序角的列表,以便随着时间的推移跟踪它们。斑点非常不规则,可以是凸面或凹面。我已经在cv :: goodFeaturesToTrack函数的所有结果中占据了n个第一个角落,并且它们倾向于与blob的最明显的角落重合(因为它为得分而不是位置命令角落)。因此,我采用此输出并通过从最左上角坐标开始交换角点,然后在角度上对角进行排序。不是旋转不变,但对于第一个版本,它可以没问题。
问题在于角落的像素位置虽然非常接近但并不总是在轮廓像素上(我通过使用RETR_EXTERNAL或RETR_CC_COMP来获取所有轮廓像素,而不是极值)。即使我调用cv :: cornerSubPix,输出也会是一个更近的像素,但仍然不一定在轮廓上。我通过执行手工制作的局部搜索来解决,用我的角替换轮廓中最近的点。无论如何,这样的解决方案" void"用cv :: cornerSubPix做的所有努力,给了我一些点在线上(非常接近角落,但不是在那一点)。有没有其他解决方案来解决这个问题?此外,由于在轮廓中排序一组点是一项相当容易的任务...为什么cv :: goodFeaturesToTrack在轮廓上的输出不一定能给出位于轮廓上的点?我做了一些错误,或者有什么理由让我无视?