如图。这个大蓝圈儿的中心就是用真实坐标(13,21)做反变换得到的相机坐标。别的圈儿是我中间debug的时候画的。(二维码的中心坐标是(10,20))
别的一些对应角点、角点排序等问题并不是我们今天的主题,我们不过多赘述,我们今天只讲opencv下最小二乘法的应用。
我们三步走:
第一步,根据实际模型填写矩阵A、B:
第二步:A和B同时乘以A的转置,得A’、B’。
第三步:用A’·X=B’解得X
那么最小二乘法应用完了,最核心的问题就解决了,剩下就是将abcdef装回矩阵,然后用
去做坐标变换罢了。
应用2:小弧度圆的拟合
给定一张图片,拍摄角度不超过10°的一个圆弧,对应的半径在像素上是从至少1000到约2600不等,圆心的位置完全不确定,只知道圆弧上的一组最广分布在±2°上的点和它们不超过±3°的对应旋转关系。
由于第二个任务目前只是在让我做一个初步的算法,还没有具体到实际的可视化,因此不能像第上一个应用那样去给大家直接展示成果,很多时候只能讲理论。
我们假设:原圆心为(x0,y0),一共有a个点,和它们对应的b个旋转关系。(这里的原圆心是(500,900),每个亚像素的噪声在x和y向的都是方差为0.5/2.58的AWGN(AddictiveWhiteGaussianNoise),即以99%概率分布在±0.5,由于这个噪声对于小弧度的圆来说实在过于致命,后来我又用最小二乘法拟合了一条补正的二次曲线,这才有了后面比较精准的解算结果,不过后面的过程我们不多赘述,重点讲第一步这个“粗略”圆心是怎么获得的)。
话不多说,三板斧开砍。
第一步,根据实际模型填写矩阵A、B:
这里的实际模型比第一例还要复杂很多,甚至矩阵维度都不是固定的——如果有a个点,A的维度将会是(a*b, a+2)。这里以a=3,b=3为例。
注意这里建模的时候,建立在“三点隶属同一圆心”这一前提上是十分重要的。Halcon的拟合方法我也用了,它并没有这样的功能,只能用一个点去不停地旋。这种拟合出来的圆心是十分离谱的,完全不能用的。
第二步:A和B同时乘以A的转置,得A’、B’。
第三步:用A’·X=B’解得X
然后,我们取X的前两项,乘以-0.5,就是圆心的坐标了。
总结:
最小二乘法三步走:填矩阵、两边乘转置、解得。说白了就是这么简单。
绝了,经典不务正业,经典一周五千字给金主小刀刮痧但摸鱼却摸的很起劲23333
哦豁,小伙伴们如果觉得倾城文选不错,记得收藏网址 或推荐给朋友哦~拜托啦 (>.<)
传送门: