LINUX.ORG.RU

Сообщения Oleg_Dorozhko

 

Разрабатываю эмулятор действий пользователя. Ищу тех, кому интересно будет использовать

Очень нужен фидбэк.

Основа - обертка для api java.awt.Robot

На входе - скрипт, на выходе - взаимодействие с интерфейсом ОС

Вот как выглядит скрипт для эмулятора:


AND

find strawberry => put_to_basket

где strawberry это скан клубники, а put_to_basket скрипт сбора клубники в корзину

Еще можно почитать здесь

 , , ,

Oleg_Dorozhko
()

Сравнение двух BufferedImage, нужна помощь

Ниже рабочий код. Но работает очень медленно.

Что тут можно оптимизировать для ускорения работы?

Скан может быть 1368 на 768 точек

Образец для сравнения 20 на 20 точек

package comparator;

import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

public class RGBComparator 
{

    /**
     * @param args
     */
    public static void main(String[] args) 
    {
        
        try
        {
        
            log("Start");
            long time1 = System.currentTimeMillis();
            
            BufferedImage img1 = ImageIO.read(new File("res/guild.png"));
            
            BufferedImage img2 = ImageIO.read(new File("res/scan1.png"));
            
            int[][][] rgb = new int[256][256][256];
            
            int w1 = img1.getWidth();
            int h1 = img1.getHeight();
            
            for(int i=0;i<w1; i++)
            {
                for(int j=0; j<h1; j++)
                {
                    int[] rgb1 = img1.getRaster().getPixel(i, j, new int[3]);
                    
                    rgb[rgb1[0]][rgb1[1]][rgb1[2]] ++;
                    
                    
                }
            }
            
            
            
            
            
            int w2 = img2.getWidth();
            int h2 = img2.getHeight();
            
            for(int x=0; x<(w2-w1)+1;x++)
            {
                for(int y=0;y<(h2-h1)+1;y++)
                {
                    
                    //log("...");
                    
                    int errors = 0;
                    
                    int[][][] c_rgb = copyRGB(rgb);
                    
                    for(int i=0;i<w1; i++)
                    {
                        for(int j=0; j<h1; j++)
                        {
                            
                                int[] rgb2 = img2.getRaster().getPixel((x+i), (y+j), new int[3]);
                                
                                int v = c_rgb[rgb2[0]][rgb2[1]][rgb2[2]];
                                
                                if( v == 0) { errors++; continue; }
                                
                                c_rgb[rgb2[0]][rgb2[1]][rgb2[2]] --;
                        
                        }
                    }
                    
                    int zcounter=0;
                    int pcounter=0;
                    int mcounter=0;
                    
                    for(int r=0;r<256;r++)
                    {
                        for(int g=0;g<256;g++)
                        {
                            for(int b=0;b<256;b++)
                            {
                                if(c_rgb[r][g][b]>0) pcounter++;
                                else if(c_rgb[r][g][b]<0) mcounter++;
                                else zcounter++;
                            }
                        }
                    }
                    
                    
                    
                    if(pcounter < 10 && mcounter < 10)
                    {
                        log("For ["+x+","+y+"]");
                        log("errors= "+errors);
                        log("pcounter= "+pcounter);
                        log("zcounter= "+zcounter);
                        log("mcounter= "+mcounter);
                        
                    }
                    
                    
                    
                }
            }
            
            long time2 = System.currentTimeMillis();
            log("Finish");
            log("ET(ms)= "+(time2-time1));
        
        
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

    }

    private static int[][][] copyRGB(int[][][] rgb) 
    {
        int[][][] res = new int[256][256][256];
    
        for(int r=0;r<256;r++)
        {
            for(int g=0;g<256;g++)
            {
                for(int b=0;b<256;b++)
                {
                    res[r][g][b] = rgb[r][g][b];
                }
            }
        }
        
        return res;
    }

    private static void log(String s) 
    {
        System.out.println(s);
        
    }

}

 , ,

Oleg_Dorozhko
()

Поиск по образцу

Использую для выявления в адресе города

Интересность в том, что вместо двоичного ответа, даю не

двоичный.

Да - полное совпадение

Нет - не совпадение

Процент совпадения

Применив теорему умножения случайностей/вероятностей для

нескольких решений можем получить предсказательную сумму

Скачать проект для eclipse можно здесь

http://basic-abc.ucoz.ru/load/java_class_for_probability_search_by_pattern/1-...

P.S. «Ну что сказать, ну что сказать, устроены так люди...»

 , , ,

Oleg_Dorozhko
()

Dolphin2 - демо-программа. Записывает и распознает ноты

dolphin2 - это обучаемая программа для распознавания звуков на мобильном телефоне В моем случае, это Nokia, у которой есть программа «синтезатор мелодий» С помощью этого синтезатора можно 7 звуков-нот записать. И собственно я их записал и они находятся в папке res под теми именами, которые в телефоне.

После запуска вам доступны две функции (кнопки) «start record» и «start recognize»

start record - эта кнопка записывает звук под именем, которое нужно ввести в поле: «Name of recording pattern» (Только буквы,

английские)

Один из вариантов: Указываете имя для записываемого звука. Затем запускаете на телефоне «Синтезатор мелодий», затем нажимаете нужную кнопку на телефоне и зазвучит нота. Как только нота начнет звучать, нужно нажать кнопку «start record » в программе Dolphin2 В Eclipse, в консоли, выводятся сообщения о процессе работы программы Записывается только пол-секунды звука (длительность смотри в Const.java) Записывается пофреймово, каждый фрейм это png картинка Потом из фреймов выборочно делается статистический файл properties для каждого образца. На их основе потом происходит распознавание Кнопка «start record » исчезает на время записи. Затем нужно указатель мышки двинуть на текстовое поле, чтобы кнопка появилась.

Так записывается образец звука.

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

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

В Eclipse, в консоли, выводятся сообщения о процессе распознавания Если распознание удачно, то становится возможным обучить dolphin2 - статистика по двум подобным образцам (входящему и максимально соотвествующему из уже записанных) особым образом совмещается -

это делается в автоматическом режиме, без вашего участия.

В Eclipse, в консоли, выводятся сообщения о процессе обучения

Если распознавание неудачно, тогда обучения не производится.

Программа Dolphin2 является демонстрационным проектом в рамках более обширного проекта распознавания голосовой речи.

https://sourceforge.net/projects/dolphin2/files/

Инструкция по установке:

Распаковываете файл - это проект eclipse - добавляете в workspace каталог вашего Eclipse и наслаждаетесь.

 dolphin2, , , sound recognizer,

Oleg_Dorozhko
()

Шахматная головоломка DAGAZ, ищу партнеров

Я пишу увлекательную, интереснейшую программу - головоломку на основе шахмат.

Пишу на Java. В Eclipse.

Ищу программистов java, которые захотят развивать проект вместе со мной.

Скачать проект для Eclipse можно https://sourceforge.net/projects/dagaz/

 , , ,

Oleg_Dorozhko
()

Написал программу для вычисления простых чисел. Вроде новый алгоритм.

Если lim=3*5*7*11*...*n т.е. факториалу простых чисел до n

то простое число m, которое меньше lim, принадлежит множеству: ^( (((m - 3) mod 2*3) = 0) || (((m - 5) mod 2*5) = 0) || (((m - 7) mod 2*7) = 0) || (((m - 11) mod 2*11) = 0) || ... || (((m - n) mod 2*n) = 0) )

Ниже приведен код, вычисляющий все простые числа до 1155. Простые числа в выводе взяты в квадратные скобки. Для удобства перенаправьте вывод в файл.


public class Main
{
	public static void main(String argv[])
	{
		try
		{
			
			
			int n = 3;
			while(true)
			{
				if(n%2==0) {n++; continue; }
				if((n-3)%6==0) System.out.print(" "+n+" ");
				else if((n-5)%10==0) System.out.print(" "+n+" ");
				else if((n-7)%14==0) System.out.print(" "+n+" ");
				else if((n-11)%22==0) System.out.print(" "+n+" ");
				else System.out.print(" ["+n+"] ");
				n++;
				if(n==1155) break;
			}
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}
}

 , , простое

Oleg_Dorozhko
()

Генератор перестановок

Выдает ровно одну перестановку в один момент времени.

Если нужно 16 перестановок, то потребуется 2 в 4 моментов времени на генерацию всех, не больше и не меньше.

Сердце программы это поток-ячейка, содержащая один бит.

Этот бит после запуска приобретает значение то 0 то 1.

Затем поток останавливается на точно определенное время.

Если такт генератора равен 1 сек, то можно например точно сказать:

любое число длиной от 0 до 20 бит будет пройдено за не более чем 1*2 в 20 секунд

package qc;

public class Main
{
	public static void main(String[] argv)
	{
		
			try
			{
				int len = 4;
				int min_takt = 100;
				int num_cycles = 100;
				QGThread[] qs = new QGThread[len]; 
				
				for(int i=0;i<len;i++)
				{
					qs[i] = new QGThread(min_takt*(int)Math.pow(2.0,(double)(len - i - 1)));
					qs[i].start();
				}
				
				//work with 4 threads
				for(int i=0;i<num_cycles;i++)
				{
					byte t1 = qs[0].getBit(); //most significant bit
					byte t2 = qs[1].getBit();
					byte t3 = qs[2].getBit();
					byte t4 = qs[3].getBit(); //least significant bit
					System.out.println(""+t1+""+t2+""+t3+""+t4);
					Thread.sleep(min_takt);
				}
				
				
				//ostanov
				for(int i=0;i<len;i++)
				{
					qs[i].stopQG();
				}
				
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
		
	}
}

//===================================


package qc;

public class QGThread extends Thread
{
	
	private byte bit = Const.ONE;
	private int takt = Const.UNDEFINED_TIME;
	private boolean stop = false;
	
	public QGThread(int t)
	{
		takt = t;
	}
	
	public synchronized void setBit(byte b)
	{
		bit=b;
	}
	
	public synchronized byte getBit()
	{
		return bit;
	}
	
	public synchronized void stopQG()
	{
		stop=true;
	}
	
	public void run()
	{
		try
		{
			while(stop==false)
			{
				if(bit == Const.ONE) bit=Const.ZERO;
				else bit=Const.ONE;
				Thread.sleep(takt);
			}
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}
}


 , permutation,

Oleg_Dorozhko
()

Пишу программу для распознавания речи

Назвал Дельфин. Написана на java. Разместил на sourceforge.net. Можно обучать. Распознает слова и печатает в чате. Цель: сделать полноценную программу, которая будет распознавать речь и печатать в чате с произнесенных слов.

Вот ссылка https://sourceforge.net/projects/opnsrcprgrmfrrc/ на проект.

Присоединяйтесь!

Мои контакты можно найти на странице проекта.

 , , ,

Oleg_Dorozhko
()

RSS подписка на новые темы