From 08027ff090f39479d886f7e3c586c5b81d65e450 Mon Sep 17 00:00:00 2001 From: sigonasr2 Date: Fri, 25 Sep 2020 19:49:34 +0900 Subject: [PATCH] Successfully detect song select for twitch stream users. --- DivaBotGuardian/DivaBotGuardian.jar | Bin 34138 -> 37330 bytes DivaBotGuardian/src/sig/ColorRegion.java | 82 +++++++++++ DivaBotGuardian/src/sig/Guardian.java | 147 ++++++++++++++++--- DivaBotGuardian/src/sig/utils/FileUtils.java | 1 + 4 files changed, 209 insertions(+), 21 deletions(-) create mode 100644 DivaBotGuardian/src/sig/ColorRegion.java diff --git a/DivaBotGuardian/DivaBotGuardian.jar b/DivaBotGuardian/DivaBotGuardian.jar index 1863ceb589f339c217d8be4f1d70ab8dc6fba316..b4d1bcf62dff4ee5645864c17767b618b1d5fd1c 100644 GIT binary patch delta 10015 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 + } + public boolean getGreenRange(int min,int max) { + int avgGreen = getGreen(); + return avgGreen>=min&&avgGreen<=max; + } + public boolean getBlueRange(int min,int max) { + int avgBlue = getBlue(); + return avgBlue>=min&&avgBlue<=max; + } + + public boolean getAllRange(int min,int max) { + return getRedRange(min,max)&&getGreenRange(min,max)&&getBlueRange(min,max); + } + public boolean getAllRange(int minRed,int maxRed,int minGreen,int maxGreen,int minBlue,int maxBlue) { + return getRedRange(minRed,maxRed)&&getGreenRange(minGreen,maxGreen)&&getBlueRange(minBlue,maxBlue); + } + + public int getRed() { + int total = 0; + for (int x=0;x=region.x+region.width||region.y+y<0||region.y+y>=region.y+region.height) { + continue; + } + total+=new Color(img.getRGB(region.x+x, region.y+y)).getRed(); + } + } + return total/(region.width*region.height); + } + public int getGreen() { + int total = 0; + for (int x=0;x=region.x+region.width||region.y+y<0||region.y+y>=region.y+region.height) { + continue; + } + total+=new Color(img.getRGB(region.x+x, region.y+y)).getGreen(); + } + } + return total/(region.width*region.height); + } + public int getBlue() { + int total = 0; + for (int x=0;x=region.x+region.width||region.y+y<0||region.y+y>=region.y+region.height) { + continue; + } + total+=new Color(img.getRGB(region.x+x, region.y+y)).getBlue(); + } + } + return total/(region.width*region.height); + } + + public String toString() { + StringBuilder sb = new StringBuilder("ColorRegion(Region: "); + return sb.append(region).append(",") + .append("R:").append(getRed()).append(",") + .append("G:").append(getGreen()).append(",") + .append("B:").append(getBlue()).append(")") + .toString(); + } +} diff --git a/DivaBotGuardian/src/sig/Guardian.java b/DivaBotGuardian/src/sig/Guardian.java index aa7ef22..5567084 100644 --- a/DivaBotGuardian/src/sig/Guardian.java +++ b/DivaBotGuardian/src/sig/Guardian.java @@ -1,6 +1,13 @@ package sig; +import java.awt.Color; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; +import java.lang.reflect.InvocationTargetException; + +import javax.imageio.ImageIO; import sig.utils.FileUtils; @@ -8,40 +15,138 @@ public class Guardian { public static int USERID = -1; public static long streamLastModified = -1; public static STAGE currentStage = STAGE.STARTING; + public static int FRAMECOUNT = 0; + + public static Point UPPERLEFTCORNER = null; + public static Point LOWERRIGHTCORNER = null; enum STAGE{ STARTING, + CALIBRATING, RUNNING, CLEANUP; } + public static BufferedImage CropFutureToneImage(BufferedImage img) throws IOException { + Point crop1 = null; + Point crop2 = null; + + Color col = new Color(img.getRGB(0, 0)); + if (col.getRed()<=5&&col.getGreen()<=5&&col.getBlue()<=5) { + boolean done=false; + for (int x=img.getWidth()-1;x>=img.getWidth()*(7f/8);x--) { + for (int y=0;y=5&&col.getGreen()>=5&&col.getBlue()>=5) { + crop1 = new Point(x,y); + done=true; + break; + } + } + if (done) { + break; + } + } + done=false; + for (int x=0;x=img.getHeight()*(7f/8);y--) { + col = new Color(img.getRGB(x, y)); + if (col.getRed()>=5&&col.getGreen()>=5&&col.getBlue()>=5) { + crop2 = new Point(x,y); + done=true; + break; + } + } + if (done) { + break; + } + } + UPPERLEFTCORNER=new Point(crop2.x,crop1.y); + LOWERRIGHTCORNER=new Point(crop1.x,crop2.y); + //img = img.getSubimage(crop2.x, crop1.y, crop1.x-crop2.x, crop2.y-crop1.y); + } + //System.out.println("Future Tone? "+MyRobot.FUTURETONE); + return img; + } + + public static int scale1280(int original) { + //772,175 + //UPPERLEFTCORNER[x=37,y=22],LOWERRIGHTCORNER[x=1239,y=692] + return (int)(original*((double)(LOWERRIGHTCORNER.x-UPPERLEFTCORNER.x)/1280))+UPPERLEFTCORNER.x; + } + public static int scale720(int original) { + return (int)(original*((double)(LOWERRIGHTCORNER.y-UPPERLEFTCORNER.y)/720))+UPPERLEFTCORNER.y; + } + public static void main(String[] args) throws InterruptedException, IOException { USERID = Integer.parseInt(args[0]); File f = new File("streams","output"+USERID+".png"); - File tempf = new File("streams","tempoutput"+USERID+".png"); - switch (currentStage) { - case STARTING:{ - while (currentStage==STAGE.STARTING) { - if (f.exists()) { - streamLastModified = f.lastModified(); - currentStage=STAGE.RUNNING; + if (f.exists()) { + f.delete(); + } + File[] tempf = new File[10]; + + for (int i=0;i=streamLastModified+5000) { - currentStage=STAGE.CLEANUP; - System.out.println("Stream is no longer being updated! Shutting down!"); + }break; + case CALIBRATING:{ + while (currentStage==STAGE.CALIBRATING) { + try { + HandleStreamFile(f, tempf[FRAMECOUNT]); + CropFutureToneImage(ImageIO.read(tempf[FRAMECOUNT])); + currentStage=STAGE.RUNNING; + } catch (IOException | InvocationTargetException | NullPointerException e) { + } + Thread.sleep(100); + } + }break; + case RUNNING:{ + while (currentStage==STAGE.RUNNING) { + long startTime = System.currentTimeMillis(); + try { + HandleStreamFile(f, tempf[FRAMECOUNT]); + BufferedImage img = ImageIO.read(tempf[FRAMECOUNT]); + //1227x690 //1.04319478402607986960065199674 + //1280x720 + ColorRegion cr = new ColorRegion(img,new Rectangle(scale1280(772),scale720(175),5,5)); + System.out.println(UPPERLEFTCORNER+","+LOWERRIGHTCORNER+"///"+"Is Song select? "+cr.getAllRange(160,200,0,15,170,200)+" "+cr+" ("+(System.currentTimeMillis()-startTime)+"ms)"); + } catch (IOException | InvocationTargetException | NullPointerException e) { + System.out.println("Skip error frame.("+(System.currentTimeMillis()-startTime)+"ms)"); + } + FRAMECOUNT=(FRAMECOUNT+1)%10; + Thread.sleep(100); } - Thread.sleep(100); + }break; + case CLEANUP:{ + f.delete(); + System.exit(0); + break program; } - }break; - case CLEANUP:{ - f.delete(); - }break; + } + } + } + + private static void HandleStreamFile(File f, File tempf) throws IOException, InvocationTargetException { + FileUtils.copyFile(f, tempf); + System.out.println(System.currentTimeMillis()+"/"+streamLastModified); + if (System.currentTimeMillis()>=streamLastModified+5000) { + currentStage=STAGE.CLEANUP; + System.out.println("Stream is no longer being updated! Shutting down!"); + } else { + streamLastModified=f.lastModified(); } } } diff --git a/DivaBotGuardian/src/sig/utils/FileUtils.java b/DivaBotGuardian/src/sig/utils/FileUtils.java index bce5562..9c38dde 100644 --- a/DivaBotGuardian/src/sig/utils/FileUtils.java +++ b/DivaBotGuardian/src/sig/utils/FileUtils.java @@ -14,6 +14,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.Reader; import java.io.Writer; +import java.lang.reflect.InvocationTargetException; import java.net.ConnectException; import java.net.HttpURLConnection; import java.net.URL;