排序图片中的像素

时间:2014-05-27 08:35:26

标签: c++ image sorting opencv

我有需要检测形状的图片。为了做到这一点,我使用了模板,我从中获取点,然后尝试将这些点适合我的图像以获得最佳匹配。当我找到最佳匹配时,我需要围绕这一点绘制曲线。

问题是所采取的点不合适。 (你可以在图片上看到)。 如何对曲线进行排序,没有“跳跃”,但是平滑。

enter image description here

我尝试使用stable_sort(),但没有成功。

stable_sort(points.begin(), points.end(), Ordering_Functor_y());
stable_sort(points.begin(), points.end(), Ordering_Functor_x());

使用stable_sort()

using 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;
    }
}

在这部分代码中,您可以看到点顺序问题在哪里。有没有更好的选择如何以正确的顺序保存点,我不会有绘制轮廓的问题?

2 个答案:

答案 0 :(得分:0)

您当前的方法是对x或y值进行排序,这不是绘制轮廓的正确顺序。

以下一种方法

  1. 计算检测到的物体的质心
  2. 将极坐标系置于质心
  3. 计算所有点的方向
  4. 按方向坐标
  5. 对点进行排序

    它会优于您当前的排序,但可能不完美。

    更复杂的方法是确定通过所有检测点的最短路径。如果点均匀地分布在轮廓周围,则该方法将定位轮廓。这种方法的搜索术语是旅行商问题。

答案 1 :(得分:0)

我认为您正在搜索Concave Hull算法。 看这里: http://ubicomp.algoritmi.uminho.pt/local/concavehull.html

Java实现:here