【问题标题】:Camera Calibration circular pattern相机校准圆形图案
【发布时间】:2015-07-23 11:57:13
【问题描述】:

我正在使用圆形图案校准图像(如下所示)来校准一对立体相机。

如果我在使用 Matlab 或/和 OPEN CV 的地方,有一些函数可以自动建立图像点和世界点之间的对应关系,这与图像中的棋盘边缘有关(例如 Matlab 中的 detectCheckerboardPoints),所以我不图像方向有问题。

我留下一张图片作为例子:

如何在检测到的随机点和现实世界中的有序网格点之间建立自动对应关系(作为自定义参考的结果)?

【问题讨论】:

  • 感谢编辑!
  • 你的问题在哪里?
  • 感谢 FooBar,我已经编辑了问题!
  • 第一个明显的问题:为什么?您可以使用棋盘准确地查找和匹配特征,那么为什么要经历这种痛苦呢?
  • 因为我想确保获得与商业软件相同的结果......实际上使用了圆圈!

标签: opencv computer-vision


【解决方案1】:

我会首先计算所有检测到的圆心的凸包,然后近似得到多边形(使其有 4 条边):

vector<Point> convex_hull;
vector<Point> poly_hull;
vector<Point> circle_centers;

// fill circle centers
...

// compute and approximate convex hull
convexHull( Mat( circle_centers ), convex_hull );
approxPolyDP( Mat( convex_hull ), poly_hull, 3, true );

下一步是找到离四个 poly_hull 点最近(以欧几里德距离计)的 4 个圆心:它们是四个角。首先以左上角顺时针方式重新排序它们,然后您可以对仿射变换进行初步估计:

vector<Point2f> dst_points;
vector<Point2f> src_points;
Rect canvas;

// fill in original canvas dimensions
...

// add source points
src_points.push_back( Point2f( canvas.tl() ) );
src_points.push_back( Point2f( canvas.width, 0 ) );
src_points.push_back( Point2f( canvas.br() ) );
src_points.push_back( Point2f( 0, canvas.height ) );

// add destination points
for ( int i = 0; i < poly_hull.size(); i++ )
    dst_points.push_back( poly_hull[i] );

// estimate transformation 
Mat transformation = estimateRigidTransform( src_points, dst_points, false );

if ( transformation.data != 0  )
{
    cout << "+++ AFFINE TRANSFORMATION ESTIMATE +++++++++++++++++++++++++++"<< endl;
    cout << "  + homography matrix: " << endl;
    cout << cv::format( "  +   [ %.3f %.3f %.3f ]", transformation.at<double>( 0, 0 ), transformation.at<double>( 0, 1 ), transformation.at<double>( 0, 2 ) ) << endl ;
    cout << cv::format( "  +   [ %.3f %.3f %.3f ]", transformation.at<double>( 1, 0 ), transformation.at<double>( 1, 1 ), transformation.at<double>( 1, 2 ) ) << endl ;
    cout << "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"<< endl;
}
else
{
    cout << "HOMOGRAPHY NO DATA" << endl;
}

之后,您可以通过使用第一次仿射变换将真实圆心投影到图像空间并寻找最近的点来找到更多对应点对,从而优化仿射估计。如果您怀疑的不仅仅是仿射,您还可以在这种情况下查看 cv::findHomography。

【讨论】:

猜你喜欢
  • 2017-01-09
  • 1970-01-01
  • 1970-01-01
  • 2017-02-06
  • 2017-10-21
  • 2011-04-05
  • 2014-07-30
  • 2023-03-09
  • 2015-09-24
相关资源
最近更新 更多