Ejemplo n.º 1
0
    # 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重建点')
Ejemplo n.º 2
0
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))
Ejemplo n.º 4
0
# 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!
Ejemplo n.º 5
0
        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()
Ejemplo n.º 6
0
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)]
Ejemplo n.º 7
0
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()
Ejemplo n.º 8
0
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)