我应该从基本的opencv正校正算法中获得什么准确度?

时间:2016-11-02 17:38:47

标签: c++ opencv computer-vision

所以,我正在接管正射校正算法的工作,该算法旨在产生“准确”的结果。我在努力提高准确性时遇到了麻烦,可以使用一些帮助。

这是基本方法。

  1. 从手机拍摄的图像中提取校准图案。
  2. 根据图像中的校准图案整理图像
  3. 缩放图像以获得图案周围场景的真实世界大小。
  4. 校准图案保持在平坦的表面上,如墙壁,柜台,桌子,地板,用户拍照。使用该图片,我们想要在与校准图案相同的表面上测量伪像。我们尝试过校准模式,范围从信用卡的大小到一张纸(8.5“x 11”)

    以下是input picture

    的示例

    结果output image

    目前我们的测量结果通常在我们预期的1-2%之内。这对于小区域(距离校准图案不到25cm)就足够了。但是,我们希望算法可以缩放,以便我们可以精确测量2x2米的面积。但是,在这个尺寸下,当前误差太大( 2-4厘米)。

    以下是我们遵循的算法。

    // convert original image to grayscale and perform morphological dilation to reduce false matches when finding circle grid
    Mat imgGray;
    cvtColor(imgOriginal, imgGray, CV_BGR2GRAY);
    
    // find calibration pattern in original image
    Size patternSize(4, 11);
    vector <Point2f> circleCenters_OriginalImage;
    if (!findCirclesGrid(imgGray, patternSize, circleCenters_OriginalImage, CALIB_CB_ASYMMETRIC_GRID))
    {
        return false;
    }
    
    Point2f inputQuad[4];
    inputQuad[0] = Point2f(circleCenters_OriginalImage[0].x, circleCenters_OriginalImage[0].y);
    inputQuad[1] = Point2f(circleCenters_OriginalImage[3].x, circleCenters_OriginalImage[3].y);
    inputQuad[2] = Point2f(circleCenters_OriginalImage[43].x, circleCenters_OriginalImage[43].y);
    inputQuad[3] = Point2f(circleCenters_OriginalImage[40].x, circleCenters_OriginalImage[40].y);
    
    // create model points for calibration pattern
    vector <Point2f> circleCenters_ObjectSpace = GeneratePatternPointsInObjectSpace(circleCenters_OriginalImage[0], Distance(circleCenters_OriginalImage[0], circleCenters_OriginalImage[1]) / 2.0f, ioData.marker_up);
    
    Point2f outputQuad[4];
    outputQuad[0] = Point2f(circleCenters_ObjectSpace[0].x, circleCenters_ObjectSpace[0].y);
    outputQuad[1] = Point2f(circleCenters_ObjectSpace[3].x, circleCenters_ObjectSpace[3].y);
    outputQuad[2] = Point2f(circleCenters_ObjectSpace[43].x, circleCenters_ObjectSpace[43].y);
    outputQuad[3] = Point2f(circleCenters_ObjectSpace[40].x, circleCenters_ObjectSpace[40].y);
    
    Mat lambda(2,4,CV_32FC1);
    lambda = Mat::zeros(imgOriginal.rows, imgOriginal.cols, imgOriginal.type());
    lambda = getPerspectiveTransform(inputQuad, outputQuad);
    
    warpPerspective(imgOriginal, imgOrthorectified, lambda, imgOrthorectified.size());
    ...
    

    我的问题: 拍摄错误是否合理&lt; 0.25%?是否有不同的算法可以产生更准确的结果?识别和解决哪些最有价值的错误来源?

    正如我已经研究过的那样,我还研究了去除枕形/桶形扭曲,并尝试使用单应性来找到透视变换。到目前为止,我发现的最佳方法仍然存在1-2%的错误。

    任何关于下一步的建议都会非常有用

0 个答案:

没有答案