main/src/georegression/geometry/ConvertRotation3D_F64.java
public static DMatrixRMaj approximateRotationMatrix( DMatrixRMaj orig, DMatrixRMaj R ) {
		R = checkDeclare3x3( R );

		SingularValueDecomposition<DMatrixRMaj> svd =
				DecompositionFactory_DDRM.svd( orig.numRows, orig.numCols ,true,true,false);

		if( !svd.decompose( orig ) )
			throw new RuntimeException( "SVD Failed" );

		CommonOps_DDRM.mult( svd.getU( null,false ), svd.getV( null,true ), R );

		// svd does not guarantee that U anv V have positive determinants.
		double det = CommonOps_DDRM.det( R );

		if( det < 0 )
			CommonOps_DDRM.scale( -1, R );

		return R;
	}
public static DMatrixRMaj approximateRotationMatrix( DMatrixRMaj orig, DMatrixRMaj R ) {
		R = checkDeclare3x3( R );

		SingularValueDecomposition<DMatrixRMaj> svd =
				DecompositionFactory_DDRM.svd( orig.numRows, orig.numCols ,true,true,false);

		if( !svd.decompose( orig ) )
			throw new RuntimeException( "SVD Failed" );

		CommonOps_DDRM.mult( svd.getU( null,false ), svd.getV( null,true ), R );

		// svd does not guarantee that U anv V have positive determinants.
		double det = CommonOps_DDRM.det( R );

		if( det < 0 )
			CommonOps_DDRM.scale( -1, R );

		return R;
	}
<p>
Finds a rotation matrix which is the optimal approximation to an arbitrary 3 by 3 matrix. Optimality
is specified by the equation below:<br>
<br>
min ||R-Q||<sup>2</sup><sub>F</sub><br>
R<br>
where R is the rotation matrix and Q is the matrix being approximated.
</p>
<p/>
<p>
The technique used is based on SVD and is described in Appendix C of "A Flexible New Technique for
Camera Calibration" Technical Report, updated 2002.
</p>
<p/>
<p>
Both origin and R can be the same instance.
</p>

@param orig Input approximate rotation matrix.  Not modified.
@param R (Optional) Storage for the approximated rotation matrix.  Modified.
@return Rotation matrix