使用 RANSAC 估计两组点之间的二维变换
Estimate 2D transformation between two sets of points using RANSAC
据我所知,OpenCV 使用 RANSAC 来解决 findHomography
的问题,它 return 提供了一些有用的参数,例如 homograph_mask
。
但是,如果我只想估计 2D 变换,这意味着仿射矩阵,有没有办法使用与 findHomography
相同的方法,它使用 RANSAC 和 return 掩码?
estimateRigidTransform does use RANSAC internally, though the parameters are fixed at the moment - see the code here - https://github.com/opencv/opencv/blob/master/modules/video/src/lkpyramid.cpp
cv::Mat cv::estimateRigidTransform( InputArray src1, InputArray src2, bool fullAffine )
{
const int RANSAC_MAX_ITERS = 500;
const int RANSAC_SIZE0 = 3;
const double RANSAC_GOOD_RATIO = 0.5;
// ...
// RANSAC stuff:
// 1. find the consensus
for( k = 0; k < RANSAC_MAX_ITERS; k++ )
{
int idx[RANSAC_SIZE0];
Point2f a[RANSAC_SIZE0];
Point2f b[RANSAC_SIZE0];
// choose random 3 non-complanar points from A & B
for( i = 0; i < RANSAC_SIZE0; i++ )
{
for( k1 = 0; k1 < RANSAC_MAX_ITERS; k1++ )
{
您可以直接使用 estimateAffinePartial2D :
https://docs.opencv.org/4.0.0/d9/d0c/group__calib3d.html#gad767faff73e9cbd8b9d92b955b50062d
cv::Mat cv::estimateAffinePartial2D (
InputArray from,
InputArray to,
OutputArray inliers = noArray(),
int method = RANSAC,
double ransacReprojThreshold = 3,
size_t maxIters = 2000,
double confidence = 0.99,
size_t refineIters = 10
)
例如:
src_pts = np.float32([pic1.key_points[m.queryIdx].pt for m in matches]).reshape(-1, 1, 2)
dst_pts = np.float32([pic2.key_points[m.trainIdx].pt for m in matches]).reshape(-1, 1, 2)
# Find the transformation between points, standard RANSAC
transformation_matrix, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
# Compute a rigid transformation (without depth, only scale + rotation + translation) and RANSAC
transformation_rigid_matrix, rigid_mask = cv2.estimateAffinePartial2D(src_pts, dst_pts)
据我所知,OpenCV 使用 RANSAC 来解决 findHomography
的问题,它 return 提供了一些有用的参数,例如 homograph_mask
。
但是,如果我只想估计 2D 变换,这意味着仿射矩阵,有没有办法使用与 findHomography
相同的方法,它使用 RANSAC 和 return 掩码?
estimateRigidTransform does use RANSAC internally, though the parameters are fixed at the moment - see the code here - https://github.com/opencv/opencv/blob/master/modules/video/src/lkpyramid.cpp
cv::Mat cv::estimateRigidTransform( InputArray src1, InputArray src2, bool fullAffine )
{
const int RANSAC_MAX_ITERS = 500;
const int RANSAC_SIZE0 = 3;
const double RANSAC_GOOD_RATIO = 0.5;
// ...
// RANSAC stuff:
// 1. find the consensus
for( k = 0; k < RANSAC_MAX_ITERS; k++ )
{
int idx[RANSAC_SIZE0];
Point2f a[RANSAC_SIZE0];
Point2f b[RANSAC_SIZE0];
// choose random 3 non-complanar points from A & B
for( i = 0; i < RANSAC_SIZE0; i++ )
{
for( k1 = 0; k1 < RANSAC_MAX_ITERS; k1++ )
{
您可以直接使用 estimateAffinePartial2D : https://docs.opencv.org/4.0.0/d9/d0c/group__calib3d.html#gad767faff73e9cbd8b9d92b955b50062d
cv::Mat cv::estimateAffinePartial2D (
InputArray from,
InputArray to,
OutputArray inliers = noArray(),
int method = RANSAC,
double ransacReprojThreshold = 3,
size_t maxIters = 2000,
double confidence = 0.99,
size_t refineIters = 10
)
例如:
src_pts = np.float32([pic1.key_points[m.queryIdx].pt for m in matches]).reshape(-1, 1, 2)
dst_pts = np.float32([pic2.key_points[m.trainIdx].pt for m in matches]).reshape(-1, 1, 2)
# Find the transformation between points, standard RANSAC
transformation_matrix, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
# Compute a rigid transformation (without depth, only scale + rotation + translation) and RANSAC
transformation_rigid_matrix, rigid_mask = cv2.estimateAffinePartial2D(src_pts, dst_pts)