/*
* Copyright (C) 2011-2015, Peter Abeles. All Rights Reserved.
*
* This file is part of Geometric Regression Library (GeoRegression).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package georegression.struct.homography;
import org.ejml.data.DenseMatrix64F;
import org.ejml.ops.CommonOps;
/**
* Various useful functions related to homographies.
*
* @author Peter Abeles
*/
public class UtilHomography {
/**
* Converts the provided 3x3 matrix into a {@link Homography2D_F64}.
*
* @param m Input 3x3 matrix.
* @param ret Storage for output. If null then a new instance is created.
* @return Equivalent homography.
*/
public static Homography2D_F64 convert( DenseMatrix64F m , Homography2D_F64 ret ) {
if( m.numCols != 3 || m.numRows != 3)
throw new IllegalArgumentException("Expected a 3 by 3 matrix.");
if( ret == null )
ret = new Homography2D_F64();
ret.a11 = m.unsafe_get(0,0);
ret.a12 = m.unsafe_get(0,1);
ret.a13 = m.unsafe_get(0,2);
ret.a21 = m.unsafe_get(1,0);
ret.a22 = m.unsafe_get(1,1);
ret.a23 = m.unsafe_get(1,2);
ret.a31 = m.unsafe_get(2,0);
ret.a32 = m.unsafe_get(2,1);
ret.a33 = m.unsafe_get(2,2);
return ret;
}
/**
* Converts the provided 3x3 matrix into a {@link Homography2D_F32}.
*
* @param m Input 3x3 matrix.
* @param ret Storage for output. If null then a new instance is created.
* @return Equivalent homography.
*/
public static Homography2D_F32 convert( DenseMatrix64F m , Homography2D_F32 ret ) {
if( m.numCols != 3 || m.numRows != 3)
throw new IllegalArgumentException("Expected a 3 by 3 matrix.");
if( ret == null )
ret = new Homography2D_F32();
ret.a11 = (float)m.unsafe_get(0,0);
ret.a12 = (float)m.unsafe_get(0,1);
ret.a13 = (float)m.unsafe_get(0,2);
ret.a21 = (float)m.unsafe_get(1,0);
ret.a22 = (float)m.unsafe_get(1,1);
ret.a23 = (float)m.unsafe_get(1,2);
ret.a31 = (float)m.unsafe_get(2,0);
ret.a32 = (float)m.unsafe_get(2,1);
ret.a33 = (float)m.unsafe_get(2,2);
return ret;
}
/**
* Converts a {@link Homography2D_F64} into a 3x3 matrix.
*
* @param m Homography
* @param ret Storage for output. If null then a new instance is created.
* @return Equivalent matrix.
*/
public static DenseMatrix64F convert( Homography2D_F64 m , DenseMatrix64F ret ) {
if( ret == null ) {
ret = new DenseMatrix64F(3,3);
} else if( ret.numCols != 3 || ret.numRows != 3)
throw new IllegalArgumentException("Expected a 3 by 3 matrix.");
ret.unsafe_set(0,0,m.a11);
ret.unsafe_set(0,1,m.a12);
ret.unsafe_set(0,2,m.a13);
ret.unsafe_set(1,0,m.a21);
ret.unsafe_set(1,1,m.a22);
ret.unsafe_set(1,2,m.a23);
ret.unsafe_set(2,0,m.a31);
ret.unsafe_set(2,1,m.a32);
ret.unsafe_set(2,2,m.a33);
return ret;
}
/**
* Converts a {@link Homography2D_F32} into a 3x3 matrix.
*
* @param m Homography
* @param ret Storage for output. If null then a new instance is created.
* @return Equivalent matrix.
*/
public static DenseMatrix64F convert( Homography2D_F32 m , DenseMatrix64F ret ) {
if( ret == null ) {
ret = new DenseMatrix64F(3,3);
} else if( ret.numCols != 3 || ret.numRows != 3)
throw new IllegalArgumentException("Expected a 3 by 3 matrix.");
ret.unsafe_set(0,0,m.a11);
ret.unsafe_set(0,1,m.a12);
ret.unsafe_set(0,2,m.a13);
ret.unsafe_set(1,0,m.a21);
ret.unsafe_set(1,1,m.a22);
ret.unsafe_set(1,2,m.a23);
ret.unsafe_set(2,0,m.a31);
ret.unsafe_set(2,1,m.a32);
ret.unsafe_set(2,2,m.a33);
return ret;
}
public static Homography2D_F64 invert( Homography2D_F64 orig , Homography2D_F64 inverted ) {
if( inverted == null )
inverted = new Homography2D_F64();
DenseMatrix64F A = new DenseMatrix64F(3,3);
convert(orig,A);
CommonOps.invert(A);
convert(A,inverted);
return inverted;
}
public static Homography2D_F32 convert( Homography2D_F64 m , Homography2D_F32 ret ) {
if( ret == null )
ret = new Homography2D_F32();
ret.a11 = (float)m.a11;
ret.a12 = (float)m.a12;
ret.a13 = (float)m.a13;
ret.a21 = (float)m.a21;
ret.a22 = (float)m.a22;
ret.a23 = (float)m.a23;
ret.a31 = (float)m.a31;
ret.a32 = (float)m.a32;
ret.a33 = (float)m.a33;
return ret;
}
public static void scale( Homography2D_F64 h , double scale ) {
h.a11 *= scale;
h.a12 *= scale;
h.a13 *= scale;
h.a21 *= scale;
h.a22 *= scale;
h.a23 *= scale;
h.a31 *= scale;
h.a32 *= scale;
h.a33 *= scale;
}
public static void print(Homography2D_F64 h)
{
for( int y = 0; y < 3; y++ ) {
for( int x = 0; x < 3; x++ ) {
System.out.printf("%8.1e ",h.get(x,y));
}
System.out.println();
}
}
}