OpenCV 2.4 estimateAffine3D in Python
Question: I'm trying to use the method cv2.estimateAffine3D but without success. Here is
my code sample :

    
    
    import numpy as np
    import cv2
    
    shape = (1, 4, 3)
    source = np.zeros(shape, np.float32)
    
    # [x, y, z]
    source[0][0] = [857, 120, 854]
    source[0][1] = [254, 120, 855]
    source[0][2] = [256, 120, 255]
    source[0][3] = [858, 120, 255]
    target = source * 10
    
    retval, M, inliers = cv2.estimateAffine3D(source, target)
    

When I try to run this sample, I obtain the same error as this other post
[here](http://stackoverflow.com/questions/12620141/estimateaffine3d-opencv-2-4-cv-
are-sizes-eqm1-m2-cv-are-sizes-eqm1-mask).

I'm using OpenCV 2.4.3 and Python 2.7.3

Please help me!


Answer: This is a known bug that is fixed in `2.4.4`.

<http://code.opencv.org/issues/2375>

If you just need rigid (rotation + translation) alignment, here's the standard
method:

    
    
    def get_rigid(src, dst): # Assumes both or Nx3 matrices
        src_mean = src.mean(0)
        dst_mean = dst.mean(0)
        # Compute covariance 
        H = reduce(lambda s, (a,b) : s + np.outer(a, b), zip(src - src_mean, dst - dst_mean), np.zeros((3,3)))
        u, s, v = np.linalg.svd(H)
        R = v.T.dot(u.T) # Rotation
        T = - R.dot(src_mean) + dst_mean # Translation
        return np.hstack((R, T[:, np.newaxis])) 
    

