Opencv 一种简单的二维点集配准算法
我试图找到一个简单的算法来找到两组2D点之间的对应关系(注册)。一个集合包含我想要查找的对象的模板,第二个集合主要包含属于感兴趣对象的点,但它可能有噪声(缺少的点以及不属于该对象的附加点)。这两个集合包含大约40个二维点。第二组是第一组的单应性(平移、旋转和透视变换) 我感兴趣的是找到一种配准算法,以便获得点对应关系。我将使用这些信息来查找两个集合之间的转换(所有这些都在OpenCV中) 有人能推荐一个算法、库或少量代码来完成这项工作吗?因为我处理的是小集合,所以不必进行超级优化。目前,我的方法是一种类似RANSAC的算法:Opencv 一种简单的二维点集配准算法,opencv,2d,registration,point,point-clouds,Opencv,2d,Registration,Point,Point Clouds,我试图找到一个简单的算法来找到两组2D点之间的对应关系(注册)。一个集合包含我想要查找的对象的模板,第二个集合主要包含属于感兴趣对象的点,但它可能有噪声(缺少的点以及不属于该对象的附加点)。这两个集合包含大约40个二维点。第二组是第一组的单应性(平移、旋转和透视变换) 我感兴趣的是找到一种配准算法,以便获得点对应关系。我将使用这些信息来查找两个集合之间的转换(所有这些都在OpenCV中) 有人能推荐一个算法、库或少量代码来完成这项工作吗?因为我处理的是小集合,所以不必进行超级优化。目前,我的方法
有什么想法吗?感谢您的输入。您可以使用
cv::findHomography
。它是一种基于RANSAC的方法,围绕着cv::getPerspectiveTransform
auto H = cv::findHomography(srcPoints, dstPoints, CV_RANSAC,3);
其中3是重投影阈值 解决问题的一种传统方法是在没有匹配对信息的情况下使用点集注册方法。点集配准类似于你们所说的方法。你们可以找到matlab实现
感谢使用python,您可以使用Open3D库,在Anaconda中很容易安装。出于您的目的,ICP应该可以正常工作,因此我们将使用经典的ICP,它在每次迭代中最小化最近点之间的点对点距离。以下是注册2个云的代码:
import numpy as np
import open3d as o3d
# Parameters:
initial_T = np.identity(4) # Initial transformation for ICP
distance = 0.1 # The threshold distance used for searching correspondences
(closest points between clouds). I'm setting it to 10 cm.
# Read your point clouds:
source = o3d.io.read_point_cloud("point_cloud_1.xyz")
target = o3d.io.read_point_cloud("point_cloud_0.xyz")
# Define the type of registration:
type = o3d.pipelines.registration.TransformationEstimationPointToPoint(False)
# "False" means rigid transformation, scale = 1
# Define the number of iterations (I'll use 100):
iterations = o3d.pipelines.registration.ICPConvergenceCriteria(max_iteration = 100)
# Do the registration:
result = o3d.pipelines.registration.registration_icp(source, target, distance, initial_T, type, iterations)
结果是一个包含4项内容的类:变换T(4x4)、2个度量(rmse和适应度)和对应集
要实现转换,请执行以下操作:
我经常用它来处理从地面激光扫描仪(TLS)和机器人(Velodiny激光雷达)获得的3D云
使用MATLAB:
我们将再次使用点对点ICP,因为您的数据是二维的。下面是一个在三角形形状内随机生成两个点云的最小示例:
% Triangle vértices:
V1 = [-20, 0; -10, 10; 0, 0];
V2 = [-10, 0; 0, 10; 10, 0];
% Create clouds and show pair:
points = 5000
N1 = criar_nuvem_triangulo(V1,points);
N2 = criar_nuvem_triangulo(V2,points);
pcshowpair(N1,N2)
% Registrate pair N1->N2 and show:
[T,N1_tranformed,RMSE]=pcregistericp(N1,N2,'Metric','pointToPoint','MaxIterations',100);
pcshowpair(N1_tranformed,N2)
“criar_nuvem_triangulo”是在三角形内生成随机点云的函数:
function [cloud] = criar_nuvem_triangulo(V,N)
% Function wich creates 2D point clouds in triangle format using random
% points
% Parameters: V = Triangle vertices (3x2 Matrix)| N = Number of points
t = sqrt(rand(N, 1));
s = rand(N, 1);
P = (1 - t) * V(1, :) + bsxfun(@times, ((1 - s) * V(2, :) + s * V(3, :)), t);
points = [P,zeros(N,1)];
cloud = pointCloud(points)
end
结果:
cv::findHomography
要求两个点集(此处的srcPoints和dstPoints)对应。我感兴趣的是如何找到对应关系,即源点云中的哪些点对应于目标点云中的哪些点。RANSAC方法仍然需要合理数量的内联线。仅仅通过两个不协调的点云是不起作用的。我以为你已经有了比赛,但想扭曲它们。然而,您只需要一个注册算法。我会试着回来later@HumamHelfawi你建议哪种注册算法?(在我的例子中,我有一个旋转和平移的,有点嘈杂的集合,我希望与预定义的集合匹配。)这确实是一种可能性。谢谢