Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Поиск изображения в изображении??? / 16 сообщений из 16, страница 1 из 1
27.12.2013, 01:12:59
    #38513736
Andruxai
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск изображения в изображении???
Всем привет. Подскажите как сделать поиск изображения в изображении. Есть два изображения: большое, и маленькое. На большом надо найти маленькое. Например: чтоб на робочем столе программа знала место расположения папок? Кто нибудь сталкивался с такой проблемой?
...
Рейтинг: 0 / 0
27.12.2013, 01:17:32
    #38513742
rema174
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск изображения в изображении???
а что представляет из себя маленькое изображение? часть большого?
...
Рейтинг: 0 / 0
27.12.2013, 01:21:11
    #38513750
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск изображения в изображении???
Нужно быстро или полный перебор пойдёт? Одноразово по какому-то действию юзера, или массовый поиск в большом количестве изобрежений?
Вообще гугл по запросу find subimage position выдаёт массу интересного материала.
...
Рейтинг: 0 / 0
27.12.2013, 01:23:26
    #38513752
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск изображения в изображении???
BlazkowiczВообще гугл по запросу find subimage position выдаёт массу интересного материала.
А если к запросу добавить слово Java то даже рабочие примеры можно найти. Там, правда полное сканирование.
...
Рейтинг: 0 / 0
27.12.2013, 01:38:16
    #38513763
Andruxai
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск изображения в изображении???
Нужно в изображении монитора найти изображения размером 20х20 пикселей(примерно). Пробовал по цвету одного пикселя который есть в изображении которое мне нужно найти(плюс добавил немного оттенков), но много побочных результатов(то что мне не нужно).
...
Рейтинг: 0 / 0
27.12.2013, 01:57:09
    #38513766
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск изображения в изображении???
Andruxai, таких постановок не бывает. Огласи реальную задачу.
...
Рейтинг: 0 / 0
27.12.2013, 02:26:36
    #38513775
Andruxai
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск изображения в изображении???
Есть два изображения:
1) изображение размером 20х20 пикселей которое находиться на жостком диске.
2) изображение которое я получаю с помощью метода createScreenCapture().
Во втором нужно найти первое.
...
Рейтинг: 0 / 0
27.12.2013, 02:28:58
    #38513776
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск изображения в изображении???
После того как ты нашёл координаты иконки на скрине. Что будет дальше?
...
Рейтинг: 0 / 0
27.12.2013, 11:52:51
    #38514039
Азагаш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск изображения в изображении???
mayton,
я делал в свое время так:
- берем кусочек 20х20 экрана левый верхний угол
- берем искомое изображение 20х20
- считаем разницу по каждому цветовому каналу для каждого пикселя
- суммируем все эти разницы по модулю
- сдвигаемся на один пиксель на экране вправо
- опять берем кусочек 20х20
- повторяем до тех пор пока не пройдем всю "строку"
- сдвигаемся обратно к левому краю и вниз на один пиксель
- повторяем до тех пор пока не перебираем весь экран
- выбираем координаты с самой маленькой суммой разниц
...
Рейтинг: 0 / 0
27.12.2013, 13:05:04
    #38514155
rema174
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск изображения в изображении???
а если оба изображения в форматах без потерь качества, то и того проще
...
Рейтинг: 0 / 0
27.12.2013, 15:02:45
    #38514312
Andruxai
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск изображения в изображении???
От нашол код который мне нада но он очень медленный. Может ктото знает как можна его ускорить?
Код:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
import java.awt.image.BufferedImage;


public class Motor {
	
				  
        int[] findSubimage(BufferedImage im1, BufferedImage im2){
        	   int w1 = im1.getWidth(); int h1 = im1.getHeight();
        	   int w2 = im2.getWidth(); int h2 = im2.getHeight();
        	   assert(w2 <= w1 && h2 <= h1);
        	   // will keep track of best position found
        	   int bestX = 0; int bestY = 0; double lowestDiff = Double.POSITIVE_INFINITY;
        	   // brute-force search through whole image (slow...)
        	   for(int x = 0;x < w1-w2;x++){
        	     for(int y = 0;y < h1-h2;y++){
        	       double comp = compareImages(im1.getSubimage(x,y,w2,h2),im2);
        	       if(comp < lowestDiff){
        	         bestX = x; bestY = y; lowestDiff = comp;
        	       }
        	     }
        	   }
        	   // output similarity measure from 0 to 1, with 0 being identical
        	   System.out.println(lowestDiff);
        	   System.out.println(bestX+" "+bestY);
        	   // return best location
        	   return new int[]{bestX,bestY};
        	   
        	 }

        	 
	
	/**
	 * Determines how different two identically sized regions are.
	 */
	private double compareImages(BufferedImage im1, BufferedImage im2) {
		assert(im1.getHeight() == im2.getHeight() && im1.getWidth() == im2.getWidth());
 	   double variation = 0.0;
 	   for(int x = 0;x < im1.getWidth();x++){
 	     for(int y = 0;y < im1.getHeight();y++){
 	        variation += compareARGB(im1.getRGB(x,y),im2.getRGB(x,y))/Math.sqrt(3);
 	     }
 	   }
 	   return variation/(im1.getWidth()*im1.getHeight());
		
	}
	/**
	 * Calculates the difference between two ARGB colours (BufferedImage.TYPE_INT_ARGB).
	 */
	private double compareARGB(int rgb1, int rgb2) {
		double r1 = ((rgb1 >> 16) & 0xFF)/255.0; double r2 = ((rgb2 >> 16) & 0xFF)/255.0;
 	   double g1 = ((rgb1 >> 8) & 0xFF)/255.0;  double g2 = ((rgb2 >> 8) & 0xFF)/255.0;
 	   double b1 = (rgb1 & 0xFF)/255.0;         double b2 = (rgb2 & 0xFF)/255.0;
 	   double a1 = ((rgb1 >> 24) & 0xFF)/255.0; double a2 = ((rgb2 >> 24) & 0xFF)/255.0;
 	   // if there is transparency, the alpha values will make difference smaller
 	   return a1*a2*Math.sqrt((r1-r2)*(r1-r2) + (g1-g2)*(g1-g2) + (b1-b2)*(b1-b2));
	}

}
...
Рейтинг: 0 / 0
27.12.2013, 15:06:25
    #38514318
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск изображения в изображении???
AndruxaiМожет ктото знает как можна его ускорить?

В compareImages стоит добавить условие и вываливаться нафиг из метода, если очевидно что изображение не совпадает. Потому что сейчас всё равно сравнивается всё изображение, даже если после нескольких пикселей ясно что оно не совпадает.
...
Рейтинг: 0 / 0
27.12.2013, 15:29:58
    #38514350
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск изображения в изображении???
Andruxai,

Представьте, что прямоугольное изображение - это множество горизонтальных линий,
расположенных вертикально. Каждую линию - можно представить как строку (типа String ).
Каждый ARGB - как char ... Короче, думаю, что для Вашего случая можно модифицировать
один из алгоритмов поиска подстроки в строке.
...
Рейтинг: 0 / 0
27.12.2013, 16:00:54
    #38514399
Andruxai
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск изображения в изображении???
BlazkowiczAndruxaiМожет ктото знает как можна его ускорить?

В compareImages стоит добавить условие и вываливаться нафиг из метода, если очевидно что изображение не совпадает. Потому что сейчас всё равно сравнивается всё изображение, даже если после нескольких пикселей ясно что оно не совпадает.

Чтото я своей тупой головой не могу понять какое условие нужно добавить. Добавил return 0 но оно всеровно долго думает. Подскажите как по вашему было б правельно.
Код:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
private double compareImages(BufferedImage im1, BufferedImage im2) {
		assert(im1.getHeight() == im2.getHeight() && im1.getWidth() == im2.getWidth());
 	   double variation = 0.0;
 	   for(int x = 0;x < im1.getWidth();x++){
 	     for(int y = 0;y < im1.getHeight();y++){
 	        variation += compareARGB(im1.getRGB(x,y),im2.getRGB(x,y))/Math.sqrt(3);
 	       
 	     }if(variation<0.03){return 0;}
 	   }
 	   return variation/(im1.getWidth()*im1.getHeight());
		
	}
...
Рейтинг: 0 / 0
28.12.2013, 00:12:07
    #38514842
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск изображения в изображении???
Andruxai, тебе наверное не нужен форум. Пиши лучше блог. Ты не слышишь задаваемых вопросов.
...
Рейтинг: 0 / 0
28.12.2013, 21:56:08
    #38515148
programania
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск изображения в изображении???
А вот программа R.java , которая нажимает на картинки на экране или клавиши.
Вызовите ee R.run("pi settings"); и она найдет картинку из файла <user.dir>settings.png
на экране методом findImage и нажмет ее как бы мышью.
По моим измерениям картинку в середине экрана 1920*1200 ищет за 0.006 секунд.

Кстати, кроме поиска картинок программу можно использовать для
выхода в нужную точку при отладке другой программы таким способом:
main(String[] args) {
R.run( ввод пароля; выбор в меню; нажатие кнопок; и т.д.);
Main class отлаживаемой программы.main(args);
}
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Поиск изображения в изображении??? / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]