相机校准圆形图案

时间:2015-07-23 11:57:13

标签: opencv computer-vision

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

如果我在哪里使用Matlab或/和OPEN CV,有些功能会自动使图像点和世界点之间的对应关系,与图像中的棋盘边缘有关(例如Matlab中的detectCheckerboardPoints),所以我不这样做有图像方向的问题。

我以图片为例: enter image description here

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

1 个答案:

答案 0 :(得分:0)

我首先计算所有检测到的圆心的凸包并近似得到的多边形(这样它有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。