Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 图片中像素的排序_C++_Image_Sorting_Opencv - Fatal编程技术网

C++ 图片中像素的排序

C++ 图片中像素的排序,c++,image,sorting,opencv,C++,Image,Sorting,Opencv,我有一张图片,我需要在上面检测形状。为了做到这一点,我使用了一个模板,我从中剥离了点,然后尝试将这些点拟合到我的图像中以获得最佳匹配。当我找到最佳匹配时,我需要围绕这些点绘制曲线 问题是所取的分数不符合顺序。(你们可以在图上看到)。 如何对曲线上的点进行排序,使其不会“跳跃”,而是平滑 我尝试了stable\u sort(),但没有成功 stable_sort(points.begin(), points.end(), Ordering_Functor_y()); stable_sort(po

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

问题是所取的分数不符合顺序。(你们可以在图上看到)。 如何对曲线上的点进行排序,使其不会“跳跃”,而是平滑

我尝试了
stable\u sort()
,但没有成功

stable_sort(points.begin(), points.end(), Ordering_Functor_y());
stable_sort(points.begin(), points.end(), Ordering_Functor_x());
使用
stable\u 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;
    }
}
for(int model_row=0;(model_row0)
{
点&新点=点(模型列、模型行);
模型点。推回(新点);
}
当前点+=图像通道;
}
}

在这部分代码中,您可以看到点顺序的问题在哪里。有没有更好的方法来保存正确顺序的点,这样我就不会在绘制等高线时遇到问题?

您当前的方法是对x或y值进行排序,而这不是绘制等高线的正确顺序

一种方法可以是:

  • 计算被检测物体的质心
  • 将极坐标系放置在质心处
  • 计算所有点的方向
  • 按方向坐标对点进行排序
  • 它将比您当前的排序更好,但可能并不完美


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

    我想你在搜索凹壳算法。 请看这里:


    Java实现:

    什么不符合顺序?您的模板点还是检测到的点?最简单的方法是按顺序“抛出”模板点。否则,一般来说,我认为您需要使用比排序更高的方法来提取轮廓。您可以尝试从“凸包”开始,并使用一些启发式方法来处理凹面。另一个启发式方法:从一个点开始。找到最近的邻居。画一条线到该相邻点并删除/忽略第一个点。找到第二个点的最近邻居,画线并移除第二个点。等等。@djpiky,看看答案可能会有帮助……你知道OpenCV有一个函数,对吗?