package net.seninp.jmotif.sax.tinker; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.Arrays; import java.util.Locale; import java.util.Map; import java.util.TreeSet; import javax.imageio.ImageIO; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; import org.jfree.data.xy.XYSeries; import org.jfree.data.xy.XYSeriesCollection; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import net.seninp.jmotif.distance.EuclideanDistance; import net.seninp.jmotif.sax.NumerosityReductionStrategy; import net.seninp.jmotif.sax.SAXProcessor; import net.seninp.jmotif.sax.TSProcessor; import net.seninp.util.HeatChart; public class MoviePrinter { private static final DecimalFormatSymbols otherSymbols = new DecimalFormatSymbols(Locale.US); private static DecimalFormat df = new DecimalFormat("0.00000", otherSymbols); private static EuclideanDistance ed = new EuclideanDistance(); private static final String DAT_FNAME = "src/resources/dataset/depth/0890031.dat"; private static final int SAX_WINDOW_SIZE = 10; private static int cPoint = SAX_WINDOW_SIZE; private static final int SAX_PAA_SIZE = 10; private static final int SAX_ALPHABET_SIZE = 4; private static final double SAX_NORM_THRESHOLD = 0.001; private static final NumerosityReductionStrategy SAX_NR_STRATEGY = NumerosityReductionStrategy.NONE; private static final int SHINGLE_SIZE = 3; // logging stuff // private static Logger LOGGER = LoggerFactory.getLogger(MoviePrinter.class); // ffmpeg -framerate 5 -i frame%04d.png -s:v 1280x720 -vcodec libx264 -profile:v high -crf 20 // -pix_fmt yuv420p daimler_man.mp4 public static void main(String[] args) throws Exception { SAXProcessor sp = new SAXProcessor(); // data // double[] dat = TSProcessor.readFileColumn(DAT_FNAME, 1, 0); // TSProcessor tp = new TSProcessor(); // double[] dat = tp.readTS("src/resources/dataset/asys40.txt", 0); // double[] dat = TSProcessor.readFileColumn(filename, columnIdx, // sizeLimit)FileColumn(DAT_FNAME, 1, 0); LOGGER.info("read {} points from {}", dat.length, DAT_FNAME); String str = "win_width: " + cPoint + "; SAX: W " + SAX_WINDOW_SIZE + ", P " + SAX_PAA_SIZE + ", A " + SAX_ALPHABET_SIZE + ", STR " + SAX_NR_STRATEGY.toString(); int frameCounter = 0; int startOffset = cPoint; while (cPoint < dat.length - startOffset - 1) { if (0 == cPoint % 2) { BufferedImage tsChart = getChart(dat, cPoint); // bitmap 1 // double[] win1 = Arrays.copyOfRange(dat, cPoint - startOffset, cPoint); Map<String, Integer> shingledData1 = sp.ts2Shingles(win1, SAX_WINDOW_SIZE, SAX_PAA_SIZE, SAX_ALPHABET_SIZE, SAX_NR_STRATEGY, SAX_NORM_THRESHOLD, SHINGLE_SIZE); BufferedImage pam1 = getHeatMap(shingledData1, "pre-window"); double[] win2 = Arrays.copyOfRange(dat, cPoint, cPoint + startOffset); Map<String, Integer> shingledData2 = sp.ts2Shingles(win2, SAX_WINDOW_SIZE, SAX_PAA_SIZE, SAX_ALPHABET_SIZE, SAX_NR_STRATEGY, SAX_NORM_THRESHOLD, SHINGLE_SIZE); BufferedImage pam2 = getHeatMap(shingledData2, "post-window"); // the assemble // BufferedImage target = new BufferedImage(800, 530, BufferedImage.TYPE_INT_ARGB); Graphics targetGraphics = target.getGraphics(); targetGraphics.setColor(Color.WHITE); targetGraphics.fillRect(0, 0, 799, 529); targetGraphics.drawImage(tsChart, 0, 0, null); targetGraphics.drawImage(pam1, 10, 410, null);// draws the first image onto it targetGraphics.drawImage(pam2, 120, 410, null);// draws the first image onto it targetGraphics.setColor(Color.RED); targetGraphics.setFont(new Font("monospaced", Font.PLAIN, 16)); targetGraphics.drawString(str, 300, 420); targetGraphics.setColor(Color.BLUE); targetGraphics.setFont(new Font("monospaced", Font.PLAIN, 24)); double dist = ed.distance(toVector(shingledData1), toVector(shingledData2)); targetGraphics.drawString("ED=" + df.format(dist), 300, 480); // String fileName = new SimpleDateFormat("yyyyMMddhhmmssSS'.png'").format(new Date()); File outputfile = new File("dframe" + String.format("%04d", frameCounter) + ".png"); ImageIO.write(target, "png", outputfile); frameCounter++; } cPoint++; } } private static double[] toVector(Map<String, Integer> shingledData1) { TreeSet<String> keys = new TreeSet<String>(shingledData1.keySet()); double[] res = new double[shingledData1.size()]; int counter = 0; for (String shingle : keys) { Integer value = shingledData1.get(shingle); res[counter] = value; counter++; } return res; } private static BufferedImage getHeatMap(Map<String, Integer> shingledData1, String title) { TreeSet<String> keys = new TreeSet<String>(shingledData1.keySet()); double[][] heatmapData = new double[8][8]; int counter = 0; for (String shingle : keys) { Integer value = shingledData1.get(shingle); heatmapData[counter / 8][counter % 8] = value; counter++; } HeatChart chart = new HeatChart(heatmapData); chart.setAxisThickness(0); chart.setTitle(title); chart.setCellSize(new Dimension(10, 10)); return (BufferedImage) chart.getChartImage(); } private static BufferedImage getChart(double[] tsData, double redDot) { try { // making the data // XYSeries dataset = new XYSeries("Series"); for (int i = 0; i < tsData.length; i++) { dataset.add(i, (float) tsData[i]); } XYSeriesCollection chartXYSeriesCollection = new XYSeriesCollection(dataset); XYSeries dot = new XYSeries("Dot"); dot.add((float) redDot, 0.0f); chartXYSeriesCollection.addSeries(dot); // set the renderer // XYLineAndShapeRenderer xyRenderer = new XYLineAndShapeRenderer(true, false); xyRenderer.setBaseStroke(new BasicStroke(3)); xyRenderer.setSeriesPaint(0, new Color(0, 0, 0)); xyRenderer.setSeriesLinesVisible(0, true); xyRenderer.setSeriesShapesVisible(0, false); xyRenderer.setSeriesPaint(1, Color.RED); xyRenderer.setSeriesLinesVisible(1, false); xyRenderer.setSeriesShapesVisible(1, true); // X - the time axis // NumberAxis timeAxis = new NumberAxis(); timeAxis.setLabel("Time"); // Y axis // NumberAxis valueAxis = new NumberAxis("Values"); valueAxis.setAutoRangeIncludesZero(false); valueAxis.setLabel("Values"); // put these into collection of dots // XYPlot timeseriesPlot = new XYPlot(chartXYSeriesCollection, timeAxis, valueAxis, xyRenderer); // finally, create the chart JFreeChart chart = new JFreeChart("", JFreeChart.DEFAULT_TITLE_FONT, timeseriesPlot, false); BufferedImage objBufferedImage = chart.createBufferedImage(800, 400); ByteArrayOutputStream bas = new ByteArrayOutputStream(); try { ImageIO.write(objBufferedImage, "png", bas); } catch (IOException e) { e.printStackTrace(); } byte[] byteArray = bas.toByteArray(); InputStream in = new ByteArrayInputStream(byteArray); BufferedImage image = ImageIO.read(in); return image; } catch (IOException e) { e.printStackTrace(); } return null; } }