我有需要检测形状的图片。为了做到这一点,我使用了模板,我从中获取点,然后尝试将这些点适合我的图像以获得最佳匹配。当我找到最佳匹配时,我需要围绕这一点绘制曲线。
问题是所采取的点不合适。 (你可以在图片上看到)。 如何对曲线进行排序,没有“跳跃”,但是平滑。
我尝试使用stable_sort()
,但没有成功。
stable_sort(points.begin(), points.end(), Ordering_Functor_y());
stable_sort(points.begin(), points.end(), Ordering_Functor_x());
使用stable_sort()
对于绘图,我使用了这个功能:
polylines(result_image, &pts, &npts, 1, true, Scalar(0, 255, 0), 3, CV_AA);
知道如何解决这个问题吗?谢谢。
修改 以下是从模板
获取积分的代码for (int model_row = 0; (model_row < model.rows); model_row++)
{
uchar *curr_point = model.ptr<uchar>(model_row);
for (int model_column = 0; (model_column < model.cols); model_column++)
{
if (*curr_point > 0)
{
Point& new_point = Point(model_column, model_row);
model_points.push_back(new_point);
}
curr_point += image_channels;
}
}
在这部分代码中,您可以看到点顺序问题在哪里。有没有更好的选择如何以正确的顺序保存点,我不会有绘制轮廓的问题?
答案 0 :(得分:0)
您当前的方法是对x或y值进行排序,这不是绘制轮廓的正确顺序。
以下一种方法
它会优于您当前的排序,但可能不完美。
更复杂的方法是确定通过所有检测点的最短路径。如果点均匀地分布在轮廓周围,则该方法将定位轮廓。这种方法的搜索术语是旅行商问题。
答案 1 :(得分:0)
我认为您正在搜索Concave Hull算法。 看这里: http://ubicomp.algoritmi.uminho.pt/local/concavehull.html
Java实现:here