Image processing 二维点集匹配

Image processing 二维点集匹配,image-processing,opencv,computer-vision,feature-detection,Image Processing,Opencv,Computer Vision,Feature Detection,将扫描(拍摄的照片)点集与模板点集(图像中的蓝色、绿色、红色和粉色圆圈)匹配的最佳方法是什么? 我正在使用opencv/c++。也许是某种ICP算法?我想包装扫描图像的模板图像 模板点集: 扫描点集: 如果对象是合理的刚性和对齐的,simple可以做到这一点。 如果没有,我会用它来估计主题和模板之间的转换(看起来你有特征点)。请提供有关该问题的一些详细信息 编辑: RANSAC(随机样本共识)可用于您的案例。将模板中不必要的点视为噪声(特征检测器检测到的虚假特征)——它们是大纲视图。RANSA

将扫描(拍摄的照片)点集与模板点集(图像中的蓝色、绿色、红色和粉色圆圈)匹配的最佳方法是什么? 我正在使用opencv/c++。也许是某种ICP算法?我想包装扫描图像的模板图像

模板点集:

扫描点集:

如果对象是合理的刚性和对齐的,simple可以做到这一点。 如果没有,我会用它来估计主题和模板之间的转换(看起来你有特征点)。请提供有关该问题的一些详细信息

编辑:
RANSAC(随机样本共识)可用于您的案例。将模板中不必要的点视为噪声(特征检测器检测到的虚假特征)——它们是大纲视图。RANSAC可以处理大纲视图,因为它随机选择一小部分特征点(可以启动模型的最小数量),启动模型并计算模型与给定数据的匹配程度(模板中有多少其他点对应于其他点)。如果选择错误的子集,此值将很低,并且您将删除模型。如果您选择正确的子集,它将是高的,您可以使用LMS算法改进匹配。

您看过OpenCV的示例了吗?此示例使用RANSAC检测两个输入图像之间的单应性。我想当你说“包裹”时,你的意思是“扭曲”?如果要使用检测到的单应矩阵扭曲图像,请查看函数。最后,是一些在OpenCV中使用不同特征检测器的好教程

编辑: 您可能没有冲浪功能,但您肯定有不同类的功能点。基于特征的匹配通常分为两个阶段:特征检测(您已经完成)和匹配所需的提取。因此,您可以尝试将您的特征转换为,然后进行特征提取和匹配。下面是一个小代码片段,介绍了如何执行此操作:

typedef int RED_TYPE = 1;
typedef int GREEN_TYPE = 2;
typedef int BLUE_TYPE = 3;
typedef int PURPLE_TYPE = 4;

struct BenFeature
{
    Point2f pt;
    int classId;
};

vector<BenFeature> benFeatures;

// Detect the features as you normally would in addition setting the class ID

vector<KeyPoint> keypoints;
for(int i = 0; i < benFeatures.size(); i++)
{
    BenFeature bf = benFeatures[i];
    KeyPoint kp(bf.pt,
                10.0, // feature neighborhood diameter (you'll probaby need to tune it)
                -1.0,  // (angle) -1 == not applicable
                500.0, // feature response strength (set to the same unless you have a metric describing strength)
                1, // octave level, (ditto as above)
                bf.classId // RED, GREEN, BLUE, or PURPLE.
                );
    keypoints.push_back(kp);
}

// now proceed with extraction and matching...
typedef int RED_TYPE=1;
typedef int绿色_TYPE=2;
typedef int BLUE_TYPE=3;
typedef int PURPLE_TYPE=4;
结构特征
{
点2f pt;
int classId;
};
矢量特征;
//除了设置类ID之外,还可以像通常一样检测功能
矢量关键点;
对于(int i=0;i

您可能需要调整响应强度,使其不会在提取阶段被阈值化。但是,希望这能说明您可能会尝试做什么。

您必须匹配红色矩形吗?原始图像的四个角中包含四个黑色矩形,似乎是为了匹配。我可以通过4行Mathematica代码可靠地找到它们:

lotto = [source image]
lottoBW = Image[Map[Max, ImageData[lotto], {2}]]
这将为每个像素取最大值(R、G、B),即它过滤掉红色和黄色打印(或多或少)。结果如下所示:

然后,我只是使用一个日志过滤器来查找黑点,并在结果图像中查找局部最大值

lottoBWG = ImageAdjust[LaplacianGaussianFilter[lottoBW, 20]]
MaxDetect[lottoBWG, 0.5]
结果: 按照以下步骤操作:

  • 匹配两幅图像中的点或特征,这将决定你的包装
  • 确定要为包装寻找什么样的转换。最通用的是单应性(参见cv::FindHomeography()),不太通用的是简单的翻译(使用cv::matchTempalte())。中间情况是沿x、y和旋转进行平移。为此,我编写了一个比单应更好的快速函数,因为它使用更少的自由度,同时仍然优化正确的度量(坐标的平方差):
  • 如果您认为您的匹配有很多异常值,请在步骤1的基础上使用RANSAC。基本上,您需要随机选择查找参数、求解、确定内联线、使用所有内联线再次求解所需的最小点集,然后迭代尝试改进当前解决方案(增加内联线的数量、减少错误或两者兼而有之)。有关RANSAC算法,请参见维基百科:

  • 我在模板和扫描图像上都检测到了矩形。现在我想使用边缘点(蓝色、绿色、红色圆圈)来包装图像。。。我不知道点之间的任何对应关系,这是findHomography(openCV)/RANSAC需要的?但我仍然需要RANSAC的点对?要匹配扫描点和模板图像点吗?我没有特征点?我刚刚得到了我的点的x,y坐标,我不认为像surf/sift这样的东西在这里起作用。因为如果你看我的原始模板图像,这些点的周围区域几乎相似。。所以我不能用brutfource或flann方法来匹配它们。但你是对的,我想使用findHomography,OpenCV的透视法。。但是我如何在模板和扫描图像之间找到点对呢?如果你查看我的另一个模板,就会发现缺少一个黑色矩形: