package org.hipi.test;
import static org.junit.Assert.*;
import org.hipi.opencv.OpenCVMatWritable;
import org.junit.Assert;
import org.junit.Test;
import org.bytedeco.javacpp.opencv_core;
import org.bytedeco.javacpp.opencv_core.Mat;
import org.bytedeco.javacpp.opencv_core.Size;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInput;
import java.io.DataInputStream;
import java.io.DataOutput;
import java.io.DataOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.DoubleBuffer;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import java.nio.ShortBuffer;
public class OpenCVMatWritableTestCase {
private final double delta = 0.01;
@Test
public void testDefaultConstructorMatDimensions() {
OpenCVMatWritable openCvMatWritable = new OpenCVMatWritable();
Mat defaultMat = openCvMatWritable.getMat();
int dims = defaultMat.dims();
assertEquals("Dims are invalid (not 1 or 2): " + dims, true, (dims == 1 || dims == 2));
}
@Test
public void testDefaultConstructorMatParameters() {
OpenCVMatWritable openCvMatWritable = new OpenCVMatWritable();
Mat defaultMat = openCvMatWritable.getMat();
assertEquals(0, defaultMat.rows());
assertEquals(0, defaultMat.cols());
assertEquals(opencv_core.CV_8UC1, defaultMat.type());
}
@Test
public void testMatConstructor() {
Mat inputMat = new Mat(new Size(5, 3), opencv_core.CV_32FC1);
OpenCVMatWritable openCvMatWritable = new OpenCVMatWritable(inputMat);
Mat outputMat = openCvMatWritable.getMat();
assertEquals(2, outputMat.dims());
assertEquals(3.0, outputMat.rows(), delta);
assertEquals(5.0, outputMat.cols(), delta);
assertEquals(opencv_core.CV_32FC1, outputMat.type());
}
@Test(expected=IllegalArgumentException.class)
public void testSetMatWithNullInput() {
Mat inputMat = null;
OpenCVMatWritable openCvMatWritable = new OpenCVMatWritable();
openCvMatWritable.setMat(inputMat);
}
@Test
public void serializeAndRecreateSignedByteMat() {
byte[] testData = new byte[] {-1, 2, -3, 4, -5, 6, -7, 8, -9, 10, -11, 12, -13, 14, -15};
Mat inputMat = new Mat(new Size(5, 3), opencv_core.CV_8SC1);
((ByteBuffer) inputMat.createBuffer()).put(testData);
OpenCVMatWritable openCVMatWritable = new OpenCVMatWritable(inputMat);
ByteArrayOutputStream baos = serializeOpenCVMatWritable(openCVMatWritable);
OpenCVMatWritable newOpenCVMatWritable = deserializeOpenCVMatWritable(baos);
Mat recreatedMat = newOpenCVMatWritable.getMat();
assertEquals(3, recreatedMat.rows());
assertEquals(5, recreatedMat.cols());
assertEquals(opencv_core.CV_8SC1, recreatedMat.type());
byte[] recreatedTestData = new byte[testData.length];
((ByteBuffer) recreatedMat.createBuffer()).get(recreatedTestData);
Assert.assertArrayEquals(testData, recreatedTestData);
}
@Test
public void serializeAndRecreateSignedShortMat() {
short[] testData = new short[] {-1, 2, -3, 4, -5, 6, -7, 8, -9, 10, -11, 12, -13, 14, -15};
Mat inputMat = new Mat(new Size(5, 3), opencv_core.CV_16SC1);
((ShortBuffer) inputMat.createBuffer()).put(testData);
OpenCVMatWritable openCVMatWritable = new OpenCVMatWritable(inputMat);
ByteArrayOutputStream baos = serializeOpenCVMatWritable(openCVMatWritable);
OpenCVMatWritable newOpenCVMatWritable = deserializeOpenCVMatWritable(baos);
Mat recreatedMat = newOpenCVMatWritable.getMat();
assertEquals(3, recreatedMat.rows());
assertEquals(5, recreatedMat.cols());
assertEquals(opencv_core.CV_16SC1, recreatedMat.type());
short[] recreatedTestData = new short[testData.length];
((ShortBuffer) recreatedMat.createBuffer()).get(recreatedTestData);
Assert.assertArrayEquals(testData, recreatedTestData);
}
@Test
public void serializeAndRecreateUnsignedShortMat() {
short[] testData = new short[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
Mat inputMat = new Mat(new Size(5, 3), opencv_core.CV_16UC1);
((ShortBuffer) inputMat.createBuffer()).put(testData);
OpenCVMatWritable openCVMatWritable = new OpenCVMatWritable(inputMat);
ByteArrayOutputStream baos = serializeOpenCVMatWritable(openCVMatWritable);
OpenCVMatWritable newOpenCVMatWritable = deserializeOpenCVMatWritable(baos);
Mat recreatedMat = newOpenCVMatWritable.getMat();
assertEquals(3, recreatedMat.rows());
assertEquals(5, recreatedMat.cols());
assertEquals(opencv_core.CV_16UC1, recreatedMat.type());
short[] recreatedTestData = new short[testData.length];
((ShortBuffer) recreatedMat.createBuffer()).get(recreatedTestData);
Assert.assertArrayEquals(testData, recreatedTestData);
}
@Test
public void serializeAndRecreateSignedIntMat() {
int[] testData = new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
Mat inputMat = new Mat(new Size(5, 3), opencv_core.CV_32SC1);
((IntBuffer) inputMat.createBuffer()).put(testData);
OpenCVMatWritable openCVMatWritable = new OpenCVMatWritable(inputMat);
ByteArrayOutputStream baos = serializeOpenCVMatWritable(openCVMatWritable);
OpenCVMatWritable newOpenCVMatWritable = deserializeOpenCVMatWritable(baos);
Mat recreatedMat = newOpenCVMatWritable.getMat();
assertEquals(3, recreatedMat.rows());
assertEquals(5, recreatedMat.cols());
assertEquals(opencv_core.CV_32SC1, recreatedMat.type());
int[] recreatedTestData = new int[testData.length];
((IntBuffer) recreatedMat.createBuffer()).get(recreatedTestData);
Assert.assertArrayEquals(testData, recreatedTestData);
}
@Test
public void serializeAndRecreateFloatMat() {
float [] testData = new float [] {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f};
Mat inputMat = new Mat(new Size(5, 3), opencv_core.CV_32FC1);
((FloatBuffer) inputMat.createBuffer()).put(testData);
OpenCVMatWritable openCVMatWritable = new OpenCVMatWritable(inputMat);
ByteArrayOutputStream baos = serializeOpenCVMatWritable(openCVMatWritable);
OpenCVMatWritable newOpenCVMatWritable = deserializeOpenCVMatWritable(baos);
Mat recreatedMat = newOpenCVMatWritable.getMat();
assertEquals(3, recreatedMat.rows());
assertEquals(5, recreatedMat.cols());
assertEquals(opencv_core.CV_32FC1, recreatedMat.type());
float[] recreatedTestData = new float[testData.length];
((FloatBuffer) recreatedMat.createBuffer()).get(recreatedTestData);
Assert.assertArrayEquals(testData, recreatedTestData, (float)delta);
}
@Test
public void serializeAndRecreateDoubleMat() {
double [] testData = new double [] {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0};
Mat inputMat = new Mat(new Size(5, 3), opencv_core.CV_64FC1);
((DoubleBuffer) inputMat.createBuffer()).put(testData);
OpenCVMatWritable openCVMatWritable = new OpenCVMatWritable(inputMat);
ByteArrayOutputStream baos = serializeOpenCVMatWritable(openCVMatWritable);
OpenCVMatWritable newOpenCVMatWritable = deserializeOpenCVMatWritable(baos);
Mat recreatedMat = newOpenCVMatWritable.getMat();
assertEquals(3, recreatedMat.rows());
assertEquals(5, recreatedMat.cols());
assertEquals(opencv_core.CV_64FC1, recreatedMat.type());
double[] recreatedTestData = new double[testData.length];
((DoubleBuffer) recreatedMat.createBuffer()).get(recreatedTestData);
Assert.assertArrayEquals(testData, recreatedTestData, delta);
}
private ByteArrayOutputStream serializeOpenCVMatWritable(OpenCVMatWritable openCVMatWritable) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutput out = new DataOutputStream(baos);
try {
openCVMatWritable.write(out);
} catch (IOException ioe) {
ioe.printStackTrace();
fail();
}
return baos;
}
private OpenCVMatWritable deserializeOpenCVMatWritable(ByteArrayOutputStream baos) {
DataInput in = new DataInputStream(new ByteArrayInputStream(baos.toByteArray()));
OpenCVMatWritable newOpenCVMatWritable = new OpenCVMatWritable();
try {
newOpenCVMatWritable.readFields(in);
} catch (IOException ioe) {
ioe.printStackTrace();
fail();
}
return newOpenCVMatWritable;
}
}