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, , , sound recognizer,

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 и наслаждаетесь.

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
()

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

 , permutation,

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

Если нужно 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();
		}
	}
}


Oleg_Dorozhko
()

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

 , , ,

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

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

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

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

Oleg_Dorozhko
()

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