Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите с проблемкой !!!  (Прочитано 11114 раз)
0 Пользователей и 1 Гость смотрят эту тему.
abdruxa
Интересующийся

ua
Offline Offline

« : 24-12-2013 09:56 » 

Всем привет.  Мне нужно знать цвет пикселей изображения монитора (размер изображения 700х500 пикселей) и если есть мне нужный цвет пикселя то он выдает мне его координаты. Я использую клас Robot, и его метод getPixelColor(х, у), но он очеьм медленный, делает проверку изображения за 20 секунд (примрно). А мне нужно чтоб проверка осуществялась раза 4 за секунду, ведь изображение постоянно меняеться.
Может ктото знает как ускорить можна этот процес???
Можна ли разбить условно это изоброжение на части и выполнить проверку одновременно во всех частях?
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 24-12-2013 10:30 » 

Цитата
Я использую клас Robot, и его метод getPixelColor(х, у),
Покажи как используешь.


зы... Набирай текст в ворде - проверяй ошибки... Только не надо про неродной язык.
Ти мене розуміэш?
« Последнее редактирование: 24-12-2013 14:55 от Sla » Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 24-12-2013 12:47 » 

Я думаю, что там getPixel как обычно. Т.е. чтобы работало быстро, нужно получить доступ к bitmap картинки как к массиву и уже там циклом пробежаться по всем пикселям будет почти мгновенно.

Распараллеливание здесь скорее всего работать не будет. Поскольку getPixel из bitmap обычно предполагает блокировку всей области изображения, т.е. всё равно все getPixel по картинке будут выполняться строго последовательно.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
abdruxa
Интересующийся

ua
Offline Offline

« Ответ #3 : 24-12-2013 14:21 » 

Пример мое программы:

Код:
import java.awt.AWTException;
import java.awt.Color;
import java.awt.Container;
import java.awt.Robot;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
 
 class myFrame extends JFrame {
   private Robot robot;

   public myFrame() {
       setTitle("Test");
       JPanel panel = new JPanel();

       try {
           robot = new Robot();
       } catch (AWTException ex) {
       }
       JButton bt1 = new JButton("Start");
       panel.add(bt1);
       bt1.addActionListener(new ActionListener() {
           public void actionPerformed(ActionEvent e) {

               System.out.println("Start");
               new Thread(new Runnable() {
                   @Override
                   public void run() {
                       System.out.println("Start in thread");
                       
                       robot.mouseMove(50,100);
                       robot.delay(200);
                       for (int i =50; i <= 350; i++) {
                           for (int j = 270; j <= 400; j++) {
                            robot.mouseMove(i, j);
                               Color c1 = robot.getPixelColor(i, j);
                               Color col = new Color(121, 133, 145);
                       
                               System.out.print("Color print: Red="+c1.getRed()+" Green="+c1.getGreen()+" Blue="+c1.getBlue());
                               System.out.print(" "+i + " " + j);
                               System.out.println();
                               if (c1.equals(col)) {
                                   System.out.print(i + " " + j + "Yes ");
                                   robot.mouseMove(i, j);
                                   robot.delay(500);
                               } else {
                                   System.out.print("No found ");
                               }
                           }
                       }
                       System.out.println("End cykle");
                      robot.mouseMove(500, 600);
                   }
               }).start();
           }
       });
       Container pane = getContentPane();
       pane.add(panel);
       pack();
   }
}

public class Test {
   public static void main(String[] args) {
       myFrame frame = new myFrame();
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       frame.show();
   }
}
« Последнее редактирование: 24-12-2013 14:54 от Sla » Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 24-12-2013 14:59 » 

abdruxa, во-первых, мне кажется, Robot - это не совсем тот класс, который подходит для поиска координат пикселя нужного цвета. MouseMove тебе зачем?
А во-вторых, в твоём коде задержки (robot.delay) - они тебе зачем?

upd. У робота есть метод createScreenCapture - делает слепок экрана в виде BufferedImage, с которым можно дальше работать.
« Последнее редактирование: 24-12-2013 15:04 от Вад » Записан
abdruxa
Интересующийся

ua
Offline Offline

« Ответ #5 : 24-12-2013 15:53 » 

MouseMove и задержки нужны для того чтоб мне показало точку от куда начинается поиск  и где он заканчиваеть и  если был найден похожый пиксель то мне на этот пиксель указал бы курсор миши(это для себя чтоб было видно). Чтото у меня не получаеть реализовать этот метод createScreenCapture().
Вот что у меня получилось:
Код:
import java.awt.AWTException;
import java.awt.Color;
import java.awt.Container;
import java.awt.Robot;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.image.BufferedImage;
import java.awt.Rectangle;

 
 class myFrame extends JFrame {
    private Robot robot;

    public myFrame() {
        setTitle("Test");
        JPanel panel = new JPanel();

        try {
            robot = new Robot();
        } catch (AWTException ex) {
        }
        JButton bt1 = new JButton("Start");
        panel.add(bt1);
        bt1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {

                System.out.println("Start");
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        System.out.println("Start in thread");
                        Rectangle rec = new Rectangle(100, 100, 999, 710);
                        BufferedImage img=robot.createScreenCapture(rec); 
                        robot.mouseMove(50,100);
                        robot.delay(200);
                        for (int i =50; i <= 350; i++) {
                            for (int j = 270; j <= 400; j++) {
                            robot.mouseMove(i, j);
                                Color c1 = new Color(img.getRGB(i, j));
                                Color col = new Color(121, 133, 145);
                         
                                System.out.print("Color print: Red="+c1.getRed()+" Green="+c1.getGreen()+" Blue="+c1.getBlue());
                                System.out.print(" "+i + " " + j);
                                System.out.println();
                                if (c1.equals(col)) {
                                    System.out.print(i + " " + j + "Yes ");
                                    robot.mouseMove(i, j);
                                    robot.delay(500);
                                } else {
                                    System.out.print("No found ");
                                }
                            }
                        }
                        System.out.println("End cykle");
                       robot.mouseMove(500, 600);
                    }
                }).start();
            }
        });
        Container pane = getContentPane();
        pane.add(panel);
        pack();
    }
}

public class Test {
    public static void main(String[] args) {
        myFrame frame = new myFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.show();
    }
}
P.S.: Если есть нелепые ошибки прошу меня извинить, я начинаюший программист.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 24-12-2013 21:47 » 

Мышка - это плохая идея. Если тебе надо подглядывать, какое место выбрал алгоритм, лучше нарисуй поверх картинки крестик или кружок в нужном месте.

Затем, для скорости работы плохая идея создавать цвета на каждый пиксел. Сравнивай прямо числа.

Наконец, эти задержки. Если будешь выводить крестик или кружок, задержки будут не нужны. Делать в отдельном потоке тоже не очень удобно - лучше по событию таймера, которое запускается ровно столько раз в секунду, сколько нужно.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
abdruxa
Интересующийся

ua
Offline Offline

« Ответ #7 : 24-12-2013 22:17 » 

С поиском цвета уже разобрался. Появилаь другая проблема, как только программа находит нужный цвет она дольжна кликнуть раз мышкой по этому пикселю, а она все время кликает туда. В чем может бить ошибка?
Код программы:
Код:
import java.awt.AWTException;
import java.awt.Color;
import java.awt.Container;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.image.BufferedImage;
 
 class myFrame extends JFrame {
    private Robot robot;

    public myFrame() {
        setTitle("Test");
        JPanel panel = new JPanel();

        try {
            robot = new Robot();
        } catch (AWTException ex) {
        }
        JButton bt1 = new JButton("Start");
        panel.add(bt1);
        bt1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {

                System.out.println("Start");
                new Thread(new Runnable() {
               
@Override
                    public void run() {
                        System.out.println("Start in thread");
                       
                    Rectangle rec = new Rectangle(0, 0, 1023, 767);
                    BufferedImage img=robot.createScreenCapture(rec);
                       for (int i =50; i <= 950; i++) {
                           for (int j = 150; j <= 566; j++) {
                                Color c1 = new Color(img.getRGB(i, j));
                                Color col=new Color(245,253,250);
                              if (c1.getBlue()<180&c1.getRed()>(col.getRed())) {
                                    robot.mouseMove(i, j);
                                    robot.mousePress(InputEvent.BUTTON1_MASK);
                                    robot.mouseRelease(InputEvent.BUTTON1_MASK);
                                    robot.delay(2500);
                               
                               }
                            }
                        }
                        System.out.println("End cykle");
                       
                    }
                }).start();
            }
        });
        Container pane = getContentPane();
        pane.add(panel);
        pack();
    }
}

public class Test {
    public static void main(String[] args) {
        myFrame frame = new myFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.show();
    }
}
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 25-12-2013 00:00 » 

Куда "туда"? У тебя в коде написано, что программа тыкает в каждый найденный пиксель, делая паузу в 2,5 секунды после каждого клика.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
abdruxa
Интересующийся

ua
Offline Offline

« Ответ #9 : 25-12-2013 07:17 » 

А потом обратно после паузы кликает по тем самым координатам, но там нет нужного ей цвета пикселя
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 25-12-2013 07:57 » 

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

ua
Offline Offline

« Ответ #11 : 25-12-2013 08:32 » 

Сделал заново createScreenCapture после каждого выполненого условия. Я хотел сделать так чтоб программа постоянно сканировала монитор и если находила то что нада, автоматически кликала по нём, добал вечный цыкл но программа работает только до тех пор пока я не нажму на мышку, как только кликнул мышью программу выбрасывает в самый конец и она только выводит "End cykle". А так находит правильно все пиксели .
Код программы:

Код:
import java.awt.AWTException;
import java.awt.Color;
import java.awt.Container;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.image.BufferedImage;
 
 class myFrame extends JFrame {
   private Robot robot;

   public myFrame() {
       setTitle("Test");
       JPanel panel = new JPanel();

       try {
           robot = new Robot();
       } catch (AWTException ex) {
       }
       JButton bt1 = new JButton("Start");
       panel.add(bt1);
       bt1.addActionListener(new ActionListener() {
           public void actionPerformed(ActionEvent e) {

               System.out.println("Start");
               new Thread(new Runnable() {
             
@Override
                   public void run() {
                       System.out.println("Start in thread");
                       
                   Rectangle rec = new Rectangle(0, 0, 1023, 767);
                   BufferedImage img=robot.createScreenCapture(rec);
                                for(;;){
                     l1: for (int i =50; i <= 950; i++) {
                          for (int j = 150; j <= 566; j++) {
                               Color c1 = new Color(img.getRGB(i, j));
                               Color col=new Color(245,253,250);
                             if (c1.getBlue()<180&c1.getRed()>(col.getRed())) {
                                   robot.mouseMove(i, j);
                                   robot.mousePress(InputEvent.BUTTON1_MASK);
                                   robot.mouseRelease(InputEvent.BUTTON1_MASK);
                                   robot.delay(2500);
                                                img=robot.createScreenCapture(rec);
                                   break l1;
                             
                              }
                           }
                       }
                       System.out.println("End cykle");
                     
                   }}
               }).start();
           }
       });
       Container pane = getContentPane();
       pane.add(panel);
       pack();
   }
}

public class Test {
   public static void main(String[] args) {
       myFrame frame = new myFrame();
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       frame.show();
   }
}
« Последнее редактирование: 25-12-2013 10:03 от Sla » Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 25-12-2013 10:03 » 

abdruxa, друже!
оборачивай код тегами [code][/code]
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
abdruxa
Интересующийся

ua
Offline Offline

« Ответ #13 : 25-12-2013 11:01 » 

я так и делаю
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 25-12-2013 11:31 » 

abdruxa, ну что тут сказать: программа ведёт себя в соответствии с написанным кодом. Ты самолично это и написал: break по метке.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
abdruxa
Интересующийся

ua
Offline Offline

« Ответ #15 : 25-12-2013 13:47 » 

Подскажите что исправить чтоб программа всегда работала и не завершала цыкл после того как она нечего не может найти на экране.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #16 : 25-12-2013 14:23 » new

abdruxa, но тогда программа не сможет закрыться. Это порочный подход. Продумай события, в ответ на которые программа что-то должна делать. И напиши код как обработку этих событий.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines