# K = np.array([[fx, 0, cx], [0, fy, cy], [0, 0, 1]], dtype= np.float32) # P1 = array([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0]]) # P2 = sfm.compute_P_from_fundamental(F) # P1 = np.dot(K, P1) # P2 = np.dot(K, P2) P1 = proj_l P2 = proj_r # X = sfm.triangulate(x1n[:, inliers], x2n[:, inliers], P1, P2) # X = sfm.triangulate(homography.make_homog(x1.T), homography.make_homog(x2.T), P1, P2) X = points_4d points_4d = X / np.tile(X[-1, :], (4, 1)) points_3d = points_4d[:3, :].T pts_3d = points_3d cam1 = camera.Camera(P1) cam2 = camera.Camera(P2) x1p = cam1.project(X) x2p = cam2.project(X) error1 = np.mean(np.sqrt(np.sum(np.square(X1_array-x1p.T[:, :2]), axis=1))) error2 = np.mean(np.sqrt(np.sum(np.square(X2_array-x2p.T[:, :2]), axis=1))) error = (error1 + error2)/2 print("error is {} {}".format(error1, error2)) if error < 1.5: break # print("error1 is {}".format(np.mean(np.sqrt(np.sum(np.square(x1-x1p.T[:, :2]), axis=1))))) # print("error2 is {}".format(np.mean(np.sqrt(np.sum(np.square(x2-x2p.T[:, :2]), axis=1))))) fig = plt.figure() ax = Axes3D(fig) ax.scatter(pts_3d[:, 0], pts_3d[:, 1], pts_3d[:, 2], c='b', s=1, linewidths=3, marker='o', label='3d重建点')
im1 = array(Image.open('../dataset_merton/images/001.jpg')) im2 = array(Image.open('../dataset_merton/images/002.jpg')) # load 2D points for each view to a list points2D = [ loadtxt('../dataset_merton/2D/00' + str(i + 1) + '.corners').T for i in range(3) ] # load 3D points points3D = loadtxt('../dataset_merton/3D/p3d').T # load correspondences corr = genfromtxt('../dataset_merton/2D/nview-corners', dtype='int', missing='*') # load cameras to a list of Camera objects P = [ camera.Camera(loadtxt('../dataset_merton/2D/00' + str(i + 1) + '.P')) for i in range(3) ] # index for points in first two views ndx = (corr[:, 0] >= 0) & (corr[:, 1] >= 0) # get coordinates and make homogeneous x1 = points2D[0][:, corr[ndx, 0]] x1 = vstack((x1, ones(x1.shape[1]))) x2 = points2D[1][:, corr[ndx, 1]] x2 = vstack((x2, ones(x2.shape[1]))) Xtrue = points3D[:, ndx] Xtrue = vstack((Xtrue, ones(Xtrue.shape[1]))) # check first 3 points Xest = sfm.triangulate(x1, x2, P[0].P, P[1].P) print Xest[:, :3]
ndx = matches.nonzero()[0] fp = homography.make_homog(l0[ndx, :2].T) ndx2 = [int(matches[i]) for i in ndx] tp = homography.make_homog(l1[ndx2, :2].T) model = homography.RansacModel() H, inliers = homography.H_from_ransac(fp, tp, model) # camera calibration K = my_calibration((747, 1000)) # 3D points at plane z=0 with sides of length 0.2 box = cube_points([0, 0, 0.1], 0.1) # project bottom square in first image cam1 = camera.Camera(hstack((K, dot(K, array([[0], [0], [-1]]))))) # first points are the bottom square box_cam1 = cam1.project(homography.make_homog(box[:, :5])) # use H to transfer points to the second image box_trans = homography.normalize(dot(H, box_cam1)) # compute second camera matrix from cam1 and H cam2 = camera.Camera(dot(H, cam1.P)) A = dot(linalg.inv(K), cam2.P[:, :3]) A = array([A[:, 0], A[:, 1], cross(A[:, 0], A[:, 1])]).T cam2.P[:, :3] = dot(K, A) # project with the second camera box_cam2 = cam2.project(homography.make_homog(box))
# load some images im1 = array(Image.open('dataset_merton/images/001.jpg')) im2 = array(Image.open('dataset_merton/images/002.jpg')) # load 2D points for each view to a list points2D = [ loadtxt('dataset_merton/2D/00' + str(i + 1) + '.corners').T for i in range(3) ] # load 3D points points3D = loadtxt('dataset_merton/3D/p3d').T # load correspondences corr = genfromtxt('dataset_merton/2D/nview-corners', dtype='int', missing='*') # load cameras to a list of Camera objects P = [ camera.Camera(loadtxt('dataset_merton/2D/00' + str(i + 1) + '.P')) for i in range(3) ] corr = corr[:, 0] # view 1 ndx3D = where(corr >= 0)[0] # missing values are -1 ndx2D = corr[ndx3D] # select visible points and make homogeneous x = points2D[0][:, ndx2D] # view 1 x = vstack((x, ones(x.shape[1]))) X = points3D[:, ndx3D] X = vstack((X, ones(X.shape[1]))) # estimate P Pest = camera.Camera(sfm.compute_P(x, X)) # compare!
ind = i infront = (d1 > 0) & (d2 > 0) X = sfm.triangulate(x1n[:, inliners], x2n[:, inliners], P1, P2[ind]) X = X[:, infront] from mpl_toolkits.mplot3d import axes3d fig = figure() ax = fig.gca(projection='3d') ax.plot(-X[0], X[1], X[2], 'k.') axis('off') from PCV.geometry import camera cam1 = camera.Camera(P1) cam2 = camera.Camera(P2[ind]) x1p = cam1.project(X) x2p = cam2.project(X) x1p = np.dot(K, x1p) x2p = np.dot(K, x2p) figure() imshow(im1) gray() plot(x1p[0], x1p[1], 'o') plot(x1[0], x1[1], 'r.') axis('off') figure()
from PCV.geometry import camera from numpy import * from PIL import Image im1 = array(Image.open('images/001.jpg')) im2 = array(Image.open('images/002.jpg')) point2D = [loadtxt('2D/00' + str(i + 1) + '.corners').T for i in range(3)] point3D = loadtxt('3D/p3d').T corr = genfromtxt('2D/nview-corners', dtype='int', missing_values='*') P = [camera.Camera(loadtxt('2D/00' + str(i + 1) + '.P')) for i in range(3)]
from PCV.geometry import sfm, camera from load_vggdata import * from pylab import * corr = corr[:, 0] ndx3D = where(corr >= 0)[0] ndx2D = corr[ndx3D] x = point2D[0][:, ndx2D] x = vstack((x, ones(x.shape[1]))) X = point3D[:, ndx3D] X = vstack((X, ones(X.shape[1]))) Pest = camera.Camera(sfm.compute_P(x, X)) print Pest.P / Pest.P[2, 3] print P[0].P / P[0].P[2, 3] Xest = Pest.project(X) figure() imshow(im1) plot(x[0], x[1], 'bo') plot(Xest[0], Xest[1], 'r.') axis('off') show()
from numpy import array, loadtxt, genfromtxt, ones, vstack from PIL import Image # load some images im1 = array(Image.open('dataset_merton/images/001.jpg')) im2 = array(Image.open('dataset_merton/images/002.jpg')) # load 2D points for each view to a list points2D = [loadtxt('dataset_merton/2D/00'+str(i+1)+'.corners').T for i in range(3)] # load 3D points points3D = loadtxt('dataset_merton/3D/p3d').T # load correspondences corr = genfromtxt('dataset_merton/2D/nview-corners',dtype='int',missing='*') # load cameras to a list of Camera objects P = [camera.Camera(loadtxt('dataset_merton/2D/00'+str(i+1)+'.P')) for i in range(3)] # index for points in first two views ndx = (corr[:,0]>=0) & (corr[:,1]>=0) # get coordinates and make homogeneous x1 = points2D[0][:,corr[ndx,0]] x1 = vstack( (x1,ones(x1.shape[1])) ) x2 = points2D[1][:,corr[ndx,1]] x2 = vstack( (x2,ones(x2.shape[1])) ) # compute F F = sfm.compute_fundamental(x1,x2) # compute the epipole e = sfm.compute_epipole(F)