программа, которая ищет данное изображение на экране - PullRequest
1 голос
/ 29 марта 2019

Я написал небольшую программу на Java, чтобы найти заданное изображение на экране и вернуть его координату.Программа компилируется просто отлично, но по некоторым причинам она не смогла найти изображение.

это выглядит примерно так:

программа получает буферизованное изображение в качестве ввода

Изображение должно быть примерно таким:

image would be something like this

следующий код для создания снимка экрана

screen= new Robot().createScreenCapture(new r 
                     rectangle(Toolkit.getDefaultToolkit().getScreenSize()));

Пример снимка экрана:

sample screenshot of screen

(в идеале программа должна вернуть координатуиконки Google Chrome)

программа пытается найти изображение, перебирая каждый пиксель на экране и пытаясь сопоставить его с пикселями данного изображения с помощью четырехугольника для цикла

for(int x = 0; x< screen.getWidth()-image.getWidth();x++){
     for(int y = 0; y< screen.getHeight()-image.getHeight();y++) {                                                   
           w=x,h=y;
           //a new rectangle is "drawn" reset the flag
           for(int a = 0; a< image.getWidth();a++){
              for(int b = 0; b< image.getHeight();b++){
                  //checks that pixel in screen matches the same pixel in the 
                  //image. if yes increment h value. if no change flag to true
                  //and breaks the loop
              }
              //checks the flag if true breaks loop other wise increment w 
              //value value
           }
           //here is the end of the "rectangle trial", if the image checks out 
           //the coordinate (w,h) will be the bottom right pixel of the image in 
           //screen. take that coordinate and return it
     }
}
after checking every pixels return coordinate (-1,-1) so that i know image doesnt exisit in the screen

Идея состоит в том, что я сопоставляю каждый пиксель на экране (за исключением пикселей, которые находятся справа и снизу) с пикселями на изображении.(представьте, что прямоугольник размером с изображение рисуется для каждого пикселя экрана, начиная со шнура (0,0), и если какой-либо пиксель в прямоугольнике не совпадает с пикселем с той же координатой в изображении, цикл forсломается, и программа переходит к следующему пикселю на экране)

следующий код - это то, что внутри циклов for

for(int x = 0; x< screen.getWidth()-image.getWidth();x++){
            for(int y = 0; y< screen.getHeight()-image.getHeight();y++){//screen sized iteration
                f=x;
                g=y;
                flag=false;
                for(int a = 0; a< image.getWidth();a++){
                    for(int b = 0; b< image.getHeight();b++){//image sized 
                        if(screen.getRGB(f,g) != image.getRGB(a,b)){
                            flag=false;
                            break;
                        }
                        else{
                            g++;
                        }
                    }
                    if(flag){
                        break;
                    }else{
                        f++;
                    }
                }
                if(!flag) {
                    returnCoords=new Coords(f-image.getWidth()/2,g-                
                    image.getHeight()/2);
                    return returnCoords;
                }
            }

        }

        return returnCoords;
    }

программа должна вывести центральную координату изображения, еслиэто будет частью экрана.если это не часть экрана, программа возвращает (-1.0, -1.0).однако, независимо от того, какое изображение я ввожу (44,0, -50,0), это координата, которую оно возвращает

ниже - скомпилированный код

import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

import java.awt.AWTException;
import java.awt.HeadlessException;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;

public class ImageScanner {     
    public static void main(String[] args) throws AWTException, IOException{
        BufferedImage image = ImageIO.read(new File("C:\\Users\\Tony\\Desktop\\my projects\\Capture.PNG"));
        Coords x=ImageScanner.scanImage(image);

        Robot robot = new Robot();
        robot.mouseMove((int)(x.getX()),(int)(x.getY()));
    }
    public static class Coords{
        int x;
        int y;
        public Coords(int width,int height){
            x=width;
            y=height;
        }
        public int getX() {
            return this.x;
        }

        public int getY() {
            return this.y;
        }

    }
    public static Coords scanImage(BufferedImage image) throws IOException, HeadlessException, AWTException {

        BufferedImage screen=null;

        screen= new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));

        int f=0;
        int g=0;
        int mismatched=0;

        ImageScanner.Coords returnCoords = new ImageScanner.Coords(-1,-1);

        for(int x = 0; x< screen.getWidth()-image.getWidth();x++){
            for(int y = 0; y< screen.getHeight()-image.getHeight();y++){//screen sized iteration
                f=x;
                g=y;
                mismatched=0;

                for(int a = 0; a< image.getWidth();a++){
                    for(int b = 0; b< image.getHeight();b++){//image sized 
                        if(screen.getRGB(f,g) != image.getRGB(a,b)){
                            mismatched++;
                        }
                        else{
                            g++;
                        }
                    }
                    g=y;
                    f++;
                }

                if((mismatched/((float)image.getWidth()*(float)image.getHeight()))<0.2) {
                    returnCoords=new Coords(f-image.getWidth()/2,g+image.getHeight()/2);
                    return returnCoords;
                }
            }

        }

        return returnCoords;
    }

}

Редактировать: Спасибо, программа теперь работает

вывод, который я получил

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...