介绍
这篇文章将为大家详细讲解有关怎么利用python实现,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
<强>大致步骤如下:强>
<>强识别参考平面强>
在这一步中,我们所需要做的事就是提取参考图像和目标图像的筛选特征,然后使用RANSAC算法稳健地估计单应性矩阵。
代码如下:
#计算特征 sift.process_image (& # 39; D:输入图片/book_frontal.JPG& # 39;,, & # 39; im0.sift& # 39;) l0, d0 =, sift.read_features_from_file (& # 39; im0.sift& # 39;) sift.process_image (& # 39; D:输入图片/book_per.JPG& # 39;,, & # 39; im1.sift& # 39;) l1, d1 =, sift.read_features_from_file (& # 39; im1.sift& # 39;) #匹配特征,并计算单应性矩阵 时间=matches sift.match_twosided (d0, d1) 时间=ndx matches.nonzero () [0] 时间=fp homography.make_homog (l0 [ndx,: 2] .T) 时间=ndx2 [int(匹配[我]),for 小姐:拷贝ndx] 时间=tp homography.make_homog (l1 [ndx2,: 2] .T) 时间=model homography.RansacModel () 时间=H, inliers homography.H_from_ransac (fp, tp,,模型)
由上面代码可得到单应性矩阵,它能够将一幅图像中标记物的点映射到另一幅图像中的对应点。还需要建立x - y (Z=0)三维坐标系,标记物在Z=0平面上,原点在标记物的某个位置上。
从单应性推导出从参考面坐标系到目标图像坐标系的转换
在进行坐标转换之前,为了检验单应性矩阵结果的正确性,需要将一些三维物体放置在目标图像上,本实验使用了一个立方体。产生立方体的代码如下:
def cube_points (c, wid): 时间=p 才能;[] p.append才能([c [0] wid,, c [1] wid。, c [2] wid]) p.append才能([c [0] wid,, c [1] + wid, c [2] wid]) p.append才能([c [0] + wid, c [1] + wid, c [2] wid]) p.append才能([c [0] + wid, c [1] wid。, c [2] wid]) p.append才能([c [0] wid,, c [1] wid。, c [2] wid]) p.append才能([c [0] wid,, c [1] wid。, c [2] + wid]) p.append才能([c [0] wid,, c [1] + wid, c [2] + wid]) p.append才能([c [0] + wid, c [1] + wid, c [2] + wid]) p.append才能([c [0] + wid, c [1] wid。, c [2] + wid]) p.append才能([c [0] wid,, c [1] wid。, c [2] + wid]) p.append才能([c [0] wid,, c [1] wid。, c [2] + wid]) p.append才能([c [0] wid,, c [1] + wid, c [2] + wid]) p.append才能([c [0] wid,, c [1] + wid, c [2] wid]) p.append才能([c [0] + wid, c [1] + wid, c [2] wid]) p.append才能([c [0] + wid, c [1] + wid, c [2] + wid]) p.append才能([c [0] + wid, c [1] wid。, c [2] + wid]) p.append才能([c [0] + wid, c [1] wid。, c [2] wid] return 数组(p)。T
先计算出照相机的标定矩阵,就可以得出两个视图间的相对变换
代码如下:
#计算照相机标定矩阵,使用图像的分辨率为747 * 1000 时间=K my_calibration ((747,, 1000)) #位于边长为0.2,Z=0平面上的三维点 时间=box cube_points ([0, 0, 0.1],, 0.1) #投影第一幅图像上底部的正方形 cam1 =, camera.Camera (hstack ((K,点(K,数组([[0],[0],[1])))))) #底部正方形上的点 box_cam1 =, cam1.project (homography.make_homog(框(:,:5))) #使用H将点变换到第二幅图像上 时间=box_trans homography.normalize(点(H, box_cam1)) #从cam1和H中计算第二个照相机矩阵 时间=cam2 camera.Camera(点(H, cam1.P)) A =,点(linalg.inv (K), cam2.P [:,: 3) A =,阵列(((:,,0),一个:,,1,,交叉([0]:也,,(:,,1)))).T ,cam2.P[:: 3],=,点(K,,) #使用第二个照相机矩阵投影 时间=box_cam2 cam2.project (homography.make_homog(箱))
在图像(像素空间)中投影我们的3 d模型并绘制它。
#底部正方形的二维投影 图() imshow (im0) 情节(box_cam1 [0,,:], box_cam1 1,,,,,线宽=3) 标题(& # 39;2 d projection of bottom 广场# 39;) 轴(& # 39;从# 39;) #使用H对二维投影进行变换 图() imshow (im1) 情节(box_trans [0,,:], box_trans 1,,,,,线宽=3) 标题(& # 39;2 d projection transfered with h # 39;) 轴(& # 39;从# 39;) #三维立方体 图() imshow (im1) 情节(box_cam2 [0,,:], box_cam2 1,,,,,线宽=3) 标题(& # 39;3 d points projected 拷贝second 图像# 39;) 轴(& # 39;从# 39;)怎么利用python实现基于“增大化现实”技术