package kaka.cakelight;
+import javafx.scene.paint.Color;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgproc.Imgproc;
-import java.awt.*;
-
import static kaka.cakelight.Main.saveFile;
import static kaka.cakelight.Main.timeIt;
private Configuration config;
private Mat colImage;
private Mat rowImage;
+ private Mat converted;
private Frame(byte[] data) {
this.data = data;
// timeIt("resizing", () -> Imgproc.resize(converted, resized, new Size(config.leds.cols, config.leds.rows), 0, 0, Imgproc.INTER_AREA)); // INTER_AREA is the best for shrinking, but also the slowest (~1.5 ms)
// });
- Mat converted = new Mat();
- Imgproc.cvtColor(src, converted, Imgproc.COLOR_YUV2RGB_YUYV);
- timeIt("model 1", () -> model1(converted, Imgproc.INTER_AREA));
- timeIt("model 2", () -> model2(converted, Imgproc.INTER_AREA));
+ Mat cropped = src.submat(
+ config.video.crop.top,
+ config.video.height - config.video.crop.bottom,
+ config.video.crop.left,
+ config.video.width - config.video.crop.right
+ );
+ converted = new Mat();
+ Imgproc.cvtColor(cropped, converted, Imgproc.COLOR_YUV2RGB_YUYV);
+// timeIt("model 1", () -> model1(converted, Imgproc.INTER_AREA));
+// timeIt("model 2", () -> model2(converted, Imgproc.INTER_AREA));
timeIt("model 3", () -> model3(converted, Imgproc.INTER_AREA));
// save(converted, "/home/kaka/test-converted.data");
// save(resized, "/home/kaka/test-resized.data");
- System.out.println("color: " + getPixel(ListPosition.BOTTOM, 0));
+ src.release();
+ cropped.release();
}
private void model1(Mat src, int interpolation) {
Imgproc.resize(src, rowImage, new Size(16, config.leds.rows), 0, 0, interpolation);
}
- public Color getPixel(ListPosition listPosition, int xy) {
+ public Color getLedColor(ListPosition listPosition, int xy) {
switch (listPosition) {
case LEFT:
- return pixelToColor(rowImage, 0, xy);
+ return interpolatedRowColor(xy, 0, 1, 2);
case RIGHT:
- return pixelToColor(rowImage, config.leds.cols - 1, xy);
+ return interpolatedRowColor(xy, 15, 14, 13);
case TOP:
- return pixelToColor(colImage, xy, 0);
+ return interpolatedColColor(xy, 0, 1, 2);
case BOTTOM:
- return pixelToColor(colImage, xy, config.leds.cols - 1);
+ return interpolatedColColor(xy, 8, 7, 6);
}
return null;
}
+ private Color interpolatedRowColor(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) {
+ 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);
- System.out.println("r = " + rgb[0] + ", g = " + rgb[1] + ", b = " + rgb[2]);
- return new Color(rgb[0], rgb[1], rgb[2]);
+ return Color.rgb(rgb[0] & 0xff, rgb[1] & 0xff, rgb[2] & 0xff);
}
private void save(Mat mat, String filepath) {
}
public byte[] getData() {
- return data;
+ byte[] buff = new byte[(int) (converted.total() * converted.channels())];
+ converted.get(0, 0, buff);
+ return buff;
+ }
+
+ public Mat getColImage() {
+ return colImage;
+ }
+
+ public Mat getRowImage() {
+ return rowImage;
+ }
+
+ public Mat getConvertedImage() {
+ return converted;
}
}