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有一个函数,对吗?