/* * Copyright Inria and Bordeaux University. * Author Jeremy Laviole. jeremy.laviole@inria.fr * PapAR project is the open-source version of the * PapARt project. License is LGPLv3, distributed with the sources. * This project can also distributed with standard commercial * licence for closed-sources projects. */ package fr.inria.papart.calibration; import java.util.Arrays; import processing.core.PApplet; import processing.core.PMatrix3D; import processing.data.XML; /** * * @author Jeremy Laviole <jeremy.laviole@inria.fr> */ public class ProjectiveDeviceCalibration extends Calibration { static final String INTRINSICS_XML_NAME = "Intrinsics"; static final String EXTRINSICS_XML_NAME = "Extrinsics"; static final String RESOLUTION_XML_NAME = "Resolution"; static final String WIDTH_XML_NAME = "Width"; static final String HEIGHT_XML_NAME = "Height"; // TO implement... // static final String DISTORSION_XML_NAME = "Distorsions"; protected final PMatrix3D intrinsics = new PMatrix3D(); protected final PMatrix3D extrinsics = new PMatrix3D(); private int width, height; private boolean hasExtrinsics = false; @Override public void addTo(XML xml) { xml.addChild(resolutionNode()); xml.addChild(intrinsicNode()); if (hasExtrinsics) { xml.addChild(extrinsicsNode()); } } private XML resolutionNode() { XML node = new XML(RESOLUTION_XML_NAME); node.setInt(WIDTH_XML_NAME, width); node.setInt(HEIGHT_XML_NAME, height); return node; } private XML intrinsicNode() { XML node = new XML(INTRINSICS_XML_NAME); setXmlTo(node, intrinsics); return node; } private XML extrinsicsNode() { XML node = new XML(EXTRINSICS_XML_NAME); setXmlTo(node, extrinsics); return node; } @Override public void replaceIn(XML xml) { XML intrNode = xml.getChild(INTRINSICS_XML_NAME); xml.removeChild(intrNode); XML extrNode = xml.getChild(EXTRINSICS_XML_NAME); xml.removeChild(extrNode); XML resNode = xml.getChild(RESOLUTION_XML_NAME); xml.removeChild(resNode); addTo(xml); } private void setXmlTo(XML xml, PMatrix3D matrix) { xml.setFloat("m00", matrix.m00); xml.setFloat("m01", matrix.m01); xml.setFloat("m02", matrix.m02); xml.setFloat("m03", matrix.m03); xml.setFloat("m10", matrix.m10); xml.setFloat("m11", matrix.m11); xml.setFloat("m12", matrix.m12); xml.setFloat("m13", matrix.m13); xml.setFloat("m20", matrix.m20); xml.setFloat("m21", matrix.m21); xml.setFloat("m22", matrix.m22); xml.setFloat("m23", matrix.m23); xml.setFloat("m30", matrix.m30); xml.setFloat("m31", matrix.m31); xml.setFloat("m32", matrix.m32); xml.setFloat("m33", matrix.m33); } private void getMatFrom(XML node, PMatrix3D matrix) { matrix.m00 = node.getFloat("m00"); matrix.m01 = node.getFloat("m01"); matrix.m02 = node.getFloat("m02"); matrix.m03 = node.getFloat("m03"); matrix.m10 = node.getFloat("m10"); matrix.m11 = node.getFloat("m11"); matrix.m12 = node.getFloat("m12"); matrix.m13 = node.getFloat("m13"); matrix.m20 = node.getFloat("m20"); matrix.m21 = node.getFloat("m21"); matrix.m22 = node.getFloat("m22"); matrix.m23 = node.getFloat("m23"); matrix.m30 = node.getFloat("m30"); matrix.m31 = node.getFloat("m31"); matrix.m32 = node.getFloat("m32"); matrix.m33 = node.getFloat("m33"); } @Override public void loadFrom(PApplet parent, String fileName) { XML root = parent.loadXML(fileName); XML resolutionNode = root.getChild(RESOLUTION_XML_NAME); this.width = resolutionNode.getInt(WIDTH_XML_NAME); this.height = resolutionNode.getInt(HEIGHT_XML_NAME); XML intrinsicsNode = root.getChild(INTRINSICS_XML_NAME); getMatFrom(intrinsicsNode, intrinsics); XML extrinsicsNode = root.getChild(EXTRINSICS_XML_NAME); if(extrinsicsNode == null){ this.hasExtrinsics = false; return; } getMatFrom(extrinsicsNode, extrinsics); checkExtrinsics(); } private void checkExtrinsics() { this.hasExtrinsics = !isIdentity(extrinsics); } public boolean isIdentity(PMatrix3D mat) { PMatrix3D identity = new PMatrix3D(); identity.reset(); float[] identityArray = new float[16]; float[] matArray = new float[16]; identity.get(identityArray); mat.get(matArray); return Arrays.equals(identityArray, matArray); } public void setExtrinsics(PMatrix3D mat) { this.extrinsics.set(mat); checkExtrinsics(); } public void setIntrinsics(PMatrix3D mat) { this.intrinsics.set(mat); } public PMatrix3D getExtrinsics(){ return this.extrinsics.get(); } public PMatrix3D getIntrinsics(){ return this.intrinsics.get(); } public boolean hasExtrinsics(){ return this.hasExtrinsics; } public int getWidth(){ return width; } public int getHeight(){ return height; } public void setWidth(int width){ this.width = width; } public void setHeight(int height){ this.height = height; } @Override public boolean isValid() { return true; // return this.pmatrix != null; } @Override public String toString() { return this.intrinsics.toString() + this.extrinsics.toString(); } }