package org.hipi.test; import static org.junit.Assert.*; import org.hipi.image.ByteImage; import org.hipi.image.FloatImage; import org.hipi.image.HipiImageFactory; import org.hipi.image.HipiImageHeader; import org.hipi.image.HipiImageHeader.HipiColorSpace; import org.hipi.image.HipiImageHeader.HipiImageFormat; import org.hipi.image.PixelArray; import org.hipi.image.io.ImageDecoder; import org.hipi.image.io.PpmCodec; import org.hipi.opencv.OpenCVUtils; import org.bytedeco.javacpp.opencv_core; import org.bytedeco.javacpp.opencv_core.Mat; import org.junit.Test; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.FloatBuffer; import java.util.ArrayList; public class OpenCVUtilsTestCase { private float delta = 0.05f; private ArrayList<FloatImage> createTestFloatImages() throws IllegalArgumentException, IOException { ArrayList<FloatImage> floatImages = new ArrayList<FloatImage>(); ImageDecoder ppmDecoder = PpmCodec.getInstance(); assertNotNull(ppmDecoder); File[] rgbFiles = new File("../testdata/jpeg-rgb").listFiles(); for (File file : rgbFiles) { if (file.isFile() && file.getName().endsWith("_photoshop.ppm")) { String ppmPath = file.getPath(); System.out.println(ppmPath); FileInputStream ppmInputStream = new FileInputStream(ppmPath); assertNotNull(ppmInputStream); HipiImageFactory imageFactory = HipiImageFactory.getFloatImageFactory(); assertNotNull(imageFactory); FloatImage image = (FloatImage)ppmDecoder.decodeHeaderAndImage(ppmInputStream, imageFactory, false); floatImages.add(image); } } return floatImages; } private ArrayList<ByteImage> createTestByteImages() throws IllegalArgumentException, IOException { ArrayList<ByteImage> byteImages = new ArrayList<ByteImage>(); ImageDecoder ppmDecoder = PpmCodec.getInstance(); assertNotNull(ppmDecoder); File[] rgbFiles = new File("../testdata/jpeg-rgb").listFiles(); for (File file : rgbFiles) { if (file.isFile() && file.getName().endsWith("_photoshop.ppm")) { String ppmPath = file.getPath(); System.out.println(ppmPath); FileInputStream ppmInputStream = new FileInputStream(ppmPath); assertNotNull(ppmInputStream); HipiImageFactory imageFactory = HipiImageFactory.getByteImageFactory(); assertNotNull(imageFactory); ByteImage image = (ByteImage)ppmDecoder.decodeHeaderAndImage(ppmInputStream, imageFactory, false); byteImages.add(image); } } return byteImages; } private FloatImage createTestFloatImage() throws IllegalArgumentException, IOException { ImageDecoder ppmDecoder = PpmCodec.getInstance(); assertNotNull(ppmDecoder); File file = new File("../testdata/jpeg-rgb").listFiles()[0]; if (file.isFile() && file.getName().endsWith("_photoshop.ppm")) { String ppmPath = file.getPath(); System.out.println(ppmPath); FileInputStream ppmInputStream = new FileInputStream(ppmPath); assertNotNull(ppmInputStream); HipiImageFactory imageFactory = HipiImageFactory.getFloatImageFactory(); assertNotNull(imageFactory); FloatImage image = (FloatImage)ppmDecoder.decodeHeaderAndImage(ppmInputStream, imageFactory, false); return image; } return null; } @Test public void testGenerateOpenCVTypeInvalidPixelArrayType() { assertEquals("Invalid lookup was not caught.", -1, OpenCVUtils.generateOpenCVType(PixelArray.TYPE_UNDEFINED, 1)); } @Test public void testGenerateOpenCVTypeInvalidChannels() { assertEquals("Invalid lookup was not caught.", -1, OpenCVUtils.generateOpenCVType(PixelArray.TYPE_BYTE, -1)); } @Test public void testGenerateOpenCVTypeIntegrityOfLookupTable() { assertEquals("Lookup of opencv_core.CV_8UC1 failed.", opencv_core.CV_8UC1, OpenCVUtils.generateOpenCVType(PixelArray.TYPE_BYTE, 1)); assertEquals("Lookup of opencv_core.CV_8UC2 failed.", opencv_core.CV_8UC2, OpenCVUtils.generateOpenCVType(PixelArray.TYPE_BYTE, 2)); assertEquals("Lookup of opencv_core.CV_8UC3 failed.", opencv_core.CV_8UC3, OpenCVUtils.generateOpenCVType(PixelArray.TYPE_BYTE, 3)); assertEquals("Lookup of opencv_core.CV_8UC4 failed.", opencv_core.CV_8UC4, OpenCVUtils.generateOpenCVType(PixelArray.TYPE_BYTE, 4)); assertEquals("Lookup of opencv_core.CV_16UC1 failed.", opencv_core.CV_16UC1, OpenCVUtils.generateOpenCVType(PixelArray.TYPE_USHORT, 1)); assertEquals("Lookup of opencv_core.CV_16UC2 failed.", opencv_core.CV_16UC2, OpenCVUtils.generateOpenCVType(PixelArray.TYPE_USHORT, 2)); assertEquals("Lookup of opencv_core.CV_16UC3 failed.", opencv_core.CV_16UC3, OpenCVUtils.generateOpenCVType(PixelArray.TYPE_USHORT, 3)); assertEquals("Lookup of opencv_core.CV_16UC4 failed.", opencv_core.CV_16UC4, OpenCVUtils.generateOpenCVType(PixelArray.TYPE_USHORT, 4)); assertEquals("Lookup of opencv_core.CV_16SC1 failed.", opencv_core.CV_16SC1, OpenCVUtils.generateOpenCVType(PixelArray.TYPE_SHORT, 1)); assertEquals("Lookup of opencv_core.CV_16SC2 failed.", opencv_core.CV_16SC2, OpenCVUtils.generateOpenCVType(PixelArray.TYPE_SHORT, 2)); assertEquals("Lookup of opencv_core.CV_16SC3 failed.", opencv_core.CV_16SC3, OpenCVUtils.generateOpenCVType(PixelArray.TYPE_SHORT, 3)); assertEquals("Lookup of opencv_core.CV_16SC4 failed.", opencv_core.CV_16SC4, OpenCVUtils.generateOpenCVType(PixelArray.TYPE_SHORT, 4)); assertEquals("Lookup of opencv_core.CV_32SC1 failed.", opencv_core.CV_32SC1, OpenCVUtils.generateOpenCVType(PixelArray.TYPE_INT, 1)); assertEquals("Lookup of opencv_core.CV_32SC2 failed.", opencv_core.CV_32SC2, OpenCVUtils.generateOpenCVType(PixelArray.TYPE_INT, 2)); assertEquals("Lookup of opencv_core.CV_32SC3 failed.", opencv_core.CV_32SC3, OpenCVUtils.generateOpenCVType(PixelArray.TYPE_INT, 3)); assertEquals("Lookup of opencv_core.CV_32SC4 failed.", opencv_core.CV_32SC4, OpenCVUtils.generateOpenCVType(PixelArray.TYPE_INT, 4)); assertEquals("Lookup of opencv_core.CV_32FC1 failed.", opencv_core.CV_32FC1, OpenCVUtils.generateOpenCVType(PixelArray.TYPE_FLOAT, 1)); assertEquals("Lookup of opencv_core.CV_32FC2 failed.", opencv_core.CV_32FC2, OpenCVUtils.generateOpenCVType(PixelArray.TYPE_FLOAT, 2)); assertEquals("Lookup of opencv_core.CV_32FC3 failed.", opencv_core.CV_32FC3, OpenCVUtils.generateOpenCVType(PixelArray.TYPE_FLOAT, 3)); assertEquals("Lookup of opencv_core.CV_32FC4 failed.", opencv_core.CV_32FC4, OpenCVUtils.generateOpenCVType(PixelArray.TYPE_FLOAT, 4)); assertEquals("Lookup of opencv_core.CV_64FC1 failed.", opencv_core.CV_64FC1, OpenCVUtils.generateOpenCVType(PixelArray.TYPE_DOUBLE, 1)); assertEquals("Lookup of opencv_core.CV_64FC2 failed.", opencv_core.CV_64FC2, OpenCVUtils.generateOpenCVType(PixelArray.TYPE_DOUBLE, 2)); assertEquals("Lookup of opencv_core.CV_64FC3 failed.", opencv_core.CV_64FC3, OpenCVUtils.generateOpenCVType(PixelArray.TYPE_DOUBLE, 3)); assertEquals("Lookup of opencv_core.CV_64FC4 failed.", opencv_core.CV_64FC4, OpenCVUtils.generateOpenCVType(PixelArray.TYPE_DOUBLE, 4)); } @Test(expected=IllegalArgumentException.class) public void testConvertRasterImageToMatNullInput() { OpenCVUtils.convertRasterImageToMat(null); } @Test(expected=IllegalArgumentException.class) public void testConvertRasterImageToMatInvalidSize() throws IllegalArgumentException, IOException { FloatImage image = createTestFloatImage(); image.setHeader(new HipiImageHeader(HipiImageFormat.JPEG, HipiColorSpace.RGB, 0, 0, 0, null, null)); OpenCVUtils.convertRasterImageToMat(image); } @Test public void testConvertRasterImageToMatWithFloatImages() throws IllegalArgumentException, IOException { for(FloatImage image : createTestFloatImages()) { Mat mat = OpenCVUtils.convertRasterImageToMat(image); assertEquals("Width of converted mat is incorrect.", image.getWidth(), mat.cols()); assertEquals("Height of converted mat is incorrect.", image.getHeight(), mat.rows()); assertEquals("opencv type of converted mat is incorrect", OpenCVUtils.generateOpenCVType(image.getPixelArray().getDataType(), image.getNumBands()), mat.type()); float[] benchmark = image.getData(); float[] convertedData = new float[benchmark.length]; ((FloatBuffer)mat.createBuffer()).get(convertedData); assertArrayEquals("contents of converted mat are incorrect", image.getData(), convertedData, delta); } } @Test public void testConvertRasterImageToMatWithByteImages() throws IllegalArgumentException, IOException { for(ByteImage image : createTestByteImages()) { Mat mat = OpenCVUtils.convertRasterImageToMat(image); assertEquals("width of converted mat is incorrect", image.getWidth(), mat.cols()); assertEquals("height of converted mat is incorrect", image.getHeight(), mat.rows()); assertEquals("opencv type of converted mat is incorrect", OpenCVUtils.generateOpenCVType(image.getPixelArray().getDataType(), image.getNumBands()), mat.type()); byte[] benchmark = image.getData(); byte[] convertedData = new byte[benchmark.length]; ((ByteBuffer)mat.createBuffer()).get(convertedData); assertArrayEquals("contents of converted mat are incorrect", image.getData(), convertedData); } } }