所以,我正在接管正射校正算法的工作,该算法旨在产生“准确”的结果。我在努力提高准确性时遇到了麻烦,可以使用一些帮助。
这是基本方法。
校准图案保持在平坦的表面上,如墙壁,柜台,桌子,地板,用户拍照。使用该图片,我们想要在与校准图案相同的表面上测量伪像。我们尝试过校准模式,范围从信用卡的大小到一张纸(8.5“x 11”)
的示例目前我们的测量结果通常在我们预期的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%的错误。
任何关于下一步的建议都会非常有用