+ src.release();
+ cropped.release();
+ }
+
+ private void model1(Mat src, int interpolation) {
+ Mat resized = new Mat();
+ Imgproc.resize(src, resized, new Size(config.leds.cols, config.leds.rows), 0, 0, interpolation);
+ }
+
+ private void model2(Mat src, int interpolation) {
+ Mat resized = new Mat();
+ Imgproc.resize(src, resized, new Size(16, 9), 0, 0, interpolation);
+ }
+
+ private void model3(Mat src, int interpolation) {
+// colImage = new Mat();
+// rowImage = new Mat();
+// Imgproc.resize(src, colImage, new Size(config.leds.cols, 9), 0, 0, interpolation);
+// Imgproc.resize(src, rowImage, new Size(16, config.leds.rows), 0, 0, interpolation);
+ }
+
+ private void model4(Mat src, int interpolation) {
+ int width = 3 * src.cols() / 16;
+ int height = 3 * src.rows() / 9;
+ Mat[] cropped = new Mat[] {
+ /* LEFT */ src.submat(0, src.rows(), 0, width),
+ /* RIGHT */ src.submat(0, src.rows(), src.cols() - width, src.cols()),
+ /* TOP */ src.submat(0, height, 0, src.cols()),
+ /* BOTTOM */ src.submat(src.rows() - height, src.rows(), 0, src.cols()),
+ };
+ images = new Mat[] {new Mat(), new Mat(), new Mat(), new Mat()};
+// Imgproc.resize(cropped[ListPosition.LEFT.ordinal()], images[ListPosition.LEFT.ordinal()], new Size(3, config.leds.rows), 0, 0, interpolation);
+ Imgproc.resize(cropped[0], images[0], new Size(3, config.leds.rows), 0, 0, interpolation);
+ Imgproc.resize(cropped[1], images[1], new Size(3, config.leds.rows), 0, 0, interpolation);
+ Imgproc.resize(cropped[2], images[2], new Size(config.leds.cols, 3), 0, 0, interpolation);
+ Imgproc.resize(cropped[3], images[3], new Size(config.leds.cols, 3), 0, 0, interpolation);
+// Imgproc.resize(src, colImage, new Size(config.leds.cols, 9), 0, 0, interpolation);
+// Imgproc.resize(src, rowImage, new Size(16, config.leds.rows), 0, 0, interpolation);
+ }
+
+ private Color wrappedGetLedColor(ListPosition listPosition, int xy) {
+ Color c = getLedColor(listPosition, xy);
+ double[] hsv = c.toHSV();
+ return Color.hsv(hsv[0], 1, 1);
+ }
+
+ private Color getLedColor(ListPosition listPosition, int xy) {
+ // TODO: maybe use highest value from pixels? 100 % from 1st, 66 % from 2nd, 33 % from 3rd. colors might be strange.
+ switch (listPosition) {
+ case LEFT:
+ return interpolatedRowColor(images[0], xy, 0, 1, 2);
+// return interpolatedRowColor(xy, 0, 1, 2);
+ case RIGHT:
+ return interpolatedRowColor(images[1], xy, 2, 1, 0);
+// return interpolatedRowColor(xy, 15, 14, 13);
+ case TOP:
+ return interpolatedColColor(images[2], xy, 0, 1, 2);
+// return interpolatedColColor(xy, 0, 1, 2);
+ case BOTTOM:
+ return interpolatedColColor(images[3], xy, 2, 1, 0);
+// return interpolatedColColor(xy, 8, 7, 6);
+ }
+ return null;
+ }
+
+ // private Color interpolatedRowColor(int y, int x1, int x2, int x3) {
+ private Color interpolatedRowColor(Mat rowImage, int y, int x1, int x2, int x3) {
+ return pixelToColor(rowImage, x3, y).interpolate(pixelToColor(rowImage, x2, y), 0.65).interpolate(pixelToColor(rowImage, x1, y), 0.65);
+ }
+
+// private Color interpolatedColColor(int x, int y1, int y2, int y3) {
+ private Color interpolatedColColor(Mat colImage, int x, int y1, int y2, int y3) {
+ return pixelToColor(colImage, x, y3).interpolate(pixelToColor(colImage, x, y2), 0.65).interpolate(pixelToColor(colImage, x, y1), 0.65);
+ }
+
+ private Color pixelToColor(Mat image, int x, int y) {
+ byte[] rgb = new byte[3];
+ image.get(y, x, rgb);
+ return Color.rgb(rgb[0] & 0xff, rgb[1] & 0xff, rgb[2] & 0xff);