上一篇说了相机参数标定的数学推导,在这里,开头先说下一般相机标定的方法。然后介绍用python的opencv进行图片拼接过程。
1.相机参数标定过程
在opencv库里也提供了相机标定方法(Camera Calibration — OpenCV.[1]):用一块国际象棋的棋板,在镜头前面不断转动,这是为了图.1里的第一个刚体变换。借此来生成不同参数,构成多个方程来解开参数。
(这里我用Ubuntu写的,标点就成英式了)
2.特征匹配和单应性查找对象
现在从上边的公式来看,对于世界坐标里的一个点,但是在图片里的位置不一样,是因为有了刚体变换,也就是说产生了物体的旋转或是镜头位置的变化.
如果我们需要求出所有相机参数,也就是说需要世界坐标系的信息.但是,我们没空.
所以单纯从两张图片上找很多很多相同点,然后进行点的匹配.
(我要道个歉,上一篇有部分写错了,已改正,不过变量名还是用重复了,需要注意下)
所以,在找到两张图片相同点后,可以用H矩阵(Homography)进行变换.
H矩阵有8个未知变量,至少需要两张图中的4个对应点,求出H矩阵后,对整张图变换,就可以了.
3.编程方法
具体看[OpenCV-Python-Toturial(有中文版)],说的特别详细. 有需要的话我可以分享到什么网盘里,一般不难找.说的是程序的事,书上基本都有.
a).程序里用了SIFT(Scale-invariant feature transform)特征提取两张图的特征点,一般是边角特征.
b).然后用knn做特征点匹配,官方代码上用了至少10个匹配点.计算时候用的就是伪逆变换.
c).需要先把图片加边,把原来图片扩展后,再乘一个单应性矩阵时,图片就不会因为经过旋转而丢失一部分. 函数用cv2.warpPerspective就行.
d).之后就是对两张图叠加,后期处理之类的了.
上边的实验结果,第一第二张是要拼接的图,第三张是第二张进行了旋转,即应用了单应性矩阵,第四张是拼接后.单纯的从结果来看,效果很差,
原因有两点:1).检测的点太多了,因为树的枝杈,匹配度太高,使得很多不一样的点被分类成了相同点; 2).最重要的是这是我拍的视频,当时在走动,根据上边的式子,它是没有深度(距离)信息的.在边往前走,边左转,就造成了合成照片越靠右侧出现越大误差.
下回预告:
下一篇,还是这个理论,试着说明怎么分析人脸朝向,这里需要用到另外一个库文件dlib.
References:
[1].https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_calib3d/py_calibration/py_calibration.html
[2].https://docs.opencv.org/3.0-beta/doc/py_tutorials/