Что нового

Поиск заданного пикселя на статичной картинке

Shpilivili

Йа нюб
Сообщения
17
Репутация
0
Я тут написал чутка своего 1го кода :laugh: Только плиз без стеба... хотя мне не жалко, издевайтесь на здоровье ;D
Задача была в следующем. Нужно найти координаты пикселя на картинке. Придумал так :D ищем пиксель по его цвету, каждый найденный проверяем на наличие пикселей определенного цвета, расположение которых относительно основного мы спалили заранее.
Сие пляски с бубном нужны мне для установки системы координат относительно картинки, относительно экрана или окна - они меняются. Если кто то подскажет более оптимальный способ, буду благодарен, НО. Сама главно скажите где ошибки в моем.Дабы мне их больше не совершать.
Код:
Const $const1A=49,$const2A=-70,$const1B=-115,$const2B=-55,$const1C=20,$const2C=-111 ; константы - разница в кооординатах между основным пикселем, который ищем в 1ю очередь, и еще 3мя пикселями.
$coord = PixelSearch(1065,65,246,1346,0xF9CF93) ; ищем основной пиксель в заданной области
If Not @error Then ; проверка, нужный ли попался пиксель.
	$go1=$coord[0]+$const1A  ;вычисление координат вспомогательного пикселя
	$go2=$coord[1]+$const2A
	$lol=PixelGetColor($go1,$go2)  ;узнаем по цвету пикселя - он это, али нет.
	if Not 1 Then  ;Если он - проверяем следущий вспомогательный(тля пущей точности) , если нет - продолжаем искать истинный основной пиксЯль.
		EndIf
EndIf
 
Автор
S

Shpilivili

Йа нюб
Сообщения
17
Репутация
0
mr.Gbabak сказал(а):
Я догадывался что что есть способ в миллион раз оптимальнее чем пытаюсь сделать я :smile: Далее цитата из описания темы: " Если кто то подскажет более оптимальный способ, буду благодарен, НО. Сама главно скажите где ошибки в моем."
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Shpilivili,
А почему Вы понизили репутацию mr.Gbabak?
 

mr.Gbabak

Осваивающий
Сообщения
257
Репутация
23
Код:
Const $const1A=49,$const2A=-70,$const1B=-115,$const2B=-55,$const1C=20,$const2C=-111 ; константы - разница в кооординатах между основным пикселем, который ищем в 1ю очередь, и еще 3мя пикселями.
Const $color_0 =0xF9CF93, $color_1=0x111111, $color_2=0x000000, $color_3=0xFFFFFF
$coord = PixelSearch(1065,65,246,1346,$color_1) ; ищем основной пиксель в заданной области

 
If Not @error Then
	$go1=$coord[0]+$const1A  ;вычисление координат вспомогательного пикселя 1
    $go2=$coord[1]+$const2A
    $lol=PixelGetColor($go1,$go2)  
	If $lol = $color_1 Then
		$go1=$coord[0]+$const1B  ;вычисление координат вспомогательного пикселя 2
		$go2=$coord[1]+$const2B
		$lol=PixelGetColor($go1,$go2)  
			If $lol = $color_2 Then
				$go1=$coord[0]+$const1C  ;вычисление координат вспомогательного пикселя 3
				$go2=$coord[1]+$const2C
				$lol=PixelGetColor($go1,$go2)  
If not @error then Msgbox (0, '', 'искомый пиксель найден') ;забыл прописать 

			Else
			EndIf
	Else
	EndIf
Else
EndIf



Добавлено:
Сообщение автоматически объединено:

Но у вас таким методом вряд ли получится.
Я как то пробовал нечто подобное, но там нужно городить очень много костылей (PixelSearch-ищет до первого совпадения и в итоге будет находить один и тот-же пиксель, либо ....костыли), так-что проще воспользоваться ссылкой которую я вам давал.
 
Автор
S

Shpilivili

Йа нюб
Сообщения
17
Репутация
0
madmasles сказал(а):
Shpilivili,
А почему Вы понизили репутацию mr.Gbabak?
Ахаха ))) Видать по затупу. Сори, Гбабак, ша исправлю.


Добавлено:
Сообщение автоматически объединено:

mr.Gbabak сказал(а):
PixelSearch-ищет до первого совпадения и в итоге будет находить один и тот-же пиксель
Хах, неожиданный фейл )) ... подкрался незаметно.
Кстать, десь как я понял должны быть константы цветов пикселей место моего лола, як я понял:
Код:
$lol=PixelGetColor($go1,$go2)
$color_0=PixelGetColor($go1,$go2) ; (исправлено)

Лан, пасиб, очень помог.Пойду изучать твой линк. А так, ради интересу, в каком направлении нужно делать костыли? Как то заставлять писельсердж не проверять уже проверенный пиксель?
 

mr.Gbabak

Осваивающий
Сообщения
257
Репутация
23
OffTopic:
оценку не исправили...

Костыли...ну например, если найденный пиксель не соответсвует, то изменять область поиска, y1=coord[1], а оставшуюсю строку сохранять в отдельные переменные/массив, с дальнейшей проверкой.
Но это долго, путанно и нагромождение лишнего.
:scratch:хотя если делать поиск через bitmap...впрочем, нет, не стоит оно того.


Добавлено:
Сообщение автоматически объединено:

Shpilivili сказал(а):
Кстать, десь как я понял должны быть константы цветов пикселей место моего лола, як я понял:
Код:
$lol=PixelGetColor($go1,$go2)
$color_0=PixelGetColor($go1,$go2) ; (исправлено)
PixelGetColor-возвращает значение пикселя.
.т.е
$color_0=PixelGetColor($go1,$go2)
получится присваивание $color_0 значения пикселя в координатах $go1,$go2, а Вам нужно сравнивать.
 
Автор
S

Shpilivili

Йа нюб
Сообщения
17
Репутация
0
mr.Gbabak сказал(а):
OffTopic:
оценку не исправили...

Костыли...ну например, если найденный пиксель не соответсвует, то изменять область поиска, y1=coord[1], а оставшуюсю строку сохранять в отдельные переменные/массив, с дальнейшей проверкой.
Но это долго, путанно и нагромождение лишнего.
Хах, эабавно.. 1е мысли по этому поводу были точно такие же.. ты не брат близнец мне случаем? хД Однако в поисках директории для PixelsearchEx наткнулся на оот такую штукенцию) Глянь что пишут по этому поводу ОтцЫ форума
Belfigor сказал(а):
vaf [?]
Только вот как мне пробежаться по всем нужным мне цветам в экране ? Вот бьюсь уже до пол второго ночи.
Например так? Псевдокод:
Код:
$col[x] = [col1, col2, ..., colN]
for $i = 0 to x step 1
    pixelsearch(col[$i])
    if not @error then
        qweqwe
    else
        ewqewq
        continueloop
    endif
next
И, самая фишка, если не ошибаюсь, если голова в 6 утра не идет кругом - отцЫ считают что pixelsearsh c "костылями" работает быстрее нежели pixelsearshEx, ибо pixelsearshEx - это какая то там обертка ))
PixelGetColor-возвращает значение пикселя.
.т.е
$color_0=PixelGetColor($go1,$go2)
получится присваивание $color_0 значения пикселя в координатах $go1,$go2, а Вам нужно сравнивать.
А, во, все, теперь сообразил, точняк. Пасиб за разъяснения.
 

mr.Gbabak

Осваивающий
Сообщения
257
Репутация
23
Не, представленный псевдокод работать быстрее не будет.
1) если я правильно уловил логику, то там не хватает координат по оси y, и если так, тоданный цыкл будет повторятся для каждого пикселя, на что уйдет очень много времени.
2) если же координаты y статичны, то опять же получается, что pixelsearch будет искать до первого совпадения в строке, а остальная часть будет не просмотренна.
OffTopic:
я слежу за репутацией...
 
Автор
S

Shpilivili

Йа нюб
Сообщения
17
Репутация
0
Долго я осмысливал функцию Pixelsherchex... И наконец разродился)) Если я правильно понял мне нужно мое условие запилить в функцию CheckPixel. Запилил. Case намбер 4. Но Пикселсерчекс с моим условием работает почему то как пикселсерч. В общем гляньте кому не трудно че я там на ваял.
Код:
; ;==========================================================================================
Func PixelSearchEx($x1, $y1, $x2, $y2, $col, $shade=0, $Case = 0, $step=1, $hwnd=0)
	Local Const $Con[8] = [$x1, $y1, $x2, $y2, "0x"&Hex($col, 6), $shade, $step, $hwnd]
	While 1
		$Check = PixelSearch($x1, $y1, $x2, $y2, $Con[4], $Con[5], $Con[6], $Con[7])
		If Not @error Then
			If CheckPixel($Check, $Case) Then
				Return $Check
			Else
				If @error Then
					SetError(2)
					Return 0
				Else
					$x1 = $Check[0]+1
					$y1 = $Check[1]
					$y2 = $Check[1]
				EndIf
			EndIf
		Else
			If  $y2 < $Con[3] Then
				$x1 = $Con[0]
				$x2 = $Con[2]
				$y2 = $Con[3]
				$y1 = $y1+1
			Else
				SetError(1)
				Return 0
			EndIf
		EndIf
	WEnd
EndFunc ;==> PixelSearchEx

=============
Func CheckPixel($Check, $Case)
	Select
		Case $Case = 0
			Return True
		Case $Case = 1
								PixelSearch($Check[0]+3, $Check[1]+3, $Check[0]+3, $Check[1]+3, 0x00E125, 5)
			If Not @error Then Return True
		Case $Case = 2
								PixelSearch($Check[0]-2, $Check[1]+5, $Check[0]-2, $Check[1]+5, 0x00E125, 5)
			If Not @error Then 	PixelSearch($Check[0]-4, $Check[1]+2, $Check[0]-4, $Check[1]+2, 0x00E125, 5)
			If Not @error Then Return True
		Case $Case = 3
								PixelSearch($Check[0]+7, $Check[1]+3, $Check[0]+7, $Check[1]+3, 0x00E125, 5)
			If Not @error Then  PixelSearch($Check[0]+3, $Check[1]+7, $Check[0]+3, $Check[1]+7, 0x00E125, 5)
			If Not @error Then  PixelSearch($Check[0]+9, $Check[1]+5, $Check[0]+9, $Check[1]+5, 0x00E125, 5)
			If Not @error Then Return True
		Case $Case =4  ; задача условия найти уникальный пиксель используя для обсервации дополнительные пикселя, местоположение которых относительно искомого пикселя заранее известно.
								Const $lol1=0xBE8976
								if not $lol1=PixelGetColor($Check[0]-82, $Check[1]+372) then @error
			If Not @error Then  Const $lol2=0x4F3F1F
								if not $lol2=PixelGetColor($Check[0]-123, $Check[1]+13) then @error
			If Not @error Then	Const $lol3=0xE6AE8D
								if not $lol3=PixelGetColor($Check[0]+230, $Check[1]+437) then @error
			If Not @error Then	Const $lol4=0xE0DACB
								if not $lol4=PixelGetColor($Check[0]-121, $Check[1]+37) then @error
			If Not @error Then	Const $lol5=0x656055
								if not $lol5=PixelGetColor($Check[0]-155, $Check[1]+18) then @error
			If Not @error Then	Const $lol6=0xFCF3A6
								if not $lol6=PixelGetColor($Check[0]-138, $Check[1]-5) then @error
			If Not @error Then	Const $lol7=0xFCF3A6
								if not $lol7=PixelGetColor($Check[0]+145, $Check[1]+258) then @error
			If Not @error Then Return True
		Case Else
			SetError(1)
			Return False
	EndSelect
	Return False
EndFunc ;==> CheckPixel
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Shpilivili,
Предупреждение За нарушение общих правил (пункт В.8):
Так как эта конференция называется "Русское сообщество AutoIt", язык общения на ней - Русский. Названия фирм или программных продуктов, аббревиатуры и т.д. должны быть написаны так, как они пишутся в оригинале, например не следует писать УСБ вместо USB. На форуме крайне не рекомендуется намеренно искажать русский язык и использовать "сетевой жаргон" на подобии "Аффтар выпей йадау!".


С уважением, ваш Глобальный модератор.
 
Автор
S

Shpilivili

Йа нюб
Сообщения
17
Репутация
0
madmasles сказал(а):
Shpilivili,
[warn]За нарушение общих правил (пункт В.8):
Так как эта конференция называется "Русское сообщество AutoIt", язык общения на ней - Русский. Названия фирм или программных продуктов, аббревиатуры и т.д. должны быть написаны так, как они пишутся в оригинале, например не следует писать УСБ вместо USB. На форуме крайне не рекомендуется намеренно искажать русский язык и использовать "сетевой жаргон" на подобии "Аффтар выпей йадау!".


С уважением, ваш Глобальный модератор.[/warn]






Меня замееетииилииии !!! :laugh:
PS Господин модератор, хоть бы код глянули за одно, там для вас плевое дело, я сам не могу в силу того что :Lamer:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
... Then @error - какая-то непонятная (мне) конструкция.


Добавлено:
Сообщение автоматически объединено:

Shpilivili [?]
хоть бы код глянули за одно
У меня нет ни малейшего желания разбирать Ваш код. Написали бы словами, что Вам надо получить в итоге.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Shpilivili
Код:
Case $Case = 4
  If  PixelGetColor($Check[0]-82,  $Check[1]+372) = 0xBE8976 _
  And PixelGetColor($Check[0]-123, $Check[1]+13)  = 0x4F3F1F _
  And PixelGetColor($Check[0]+230, $Check[1]+437) = 0xE6AE8D _
  And PixelGetColor($Check[0]-121, $Check[1]+37)  = 0xE0DACB _
  And PixelGetColor($Check[0]-155, $Check[1]+18)  = 0x656055 _
  And PixelGetColor($Check[0]-138, $Check[1]-5)   = 0xFCF3A6 _
  And PixelGetColor($Check[0]+145, $Check[1]+258) = 0xFCF3A6 Then Return True
 
Автор
S

Shpilivili

Йа нюб
Сообщения
17
Репутация
0
madmasles сказал(а):
... Then @error - какая-то непонятная (мне) конструкция.
Если выражение не верно - значит ошибка. Так не бывает?)


Добавлено:
Сообщение автоматически объединено:

InnI сказал(а):
Этот мир не безнадежен пока в нем есть такие как InnI хДД Большое спасибо за помощь, но если не сложно разъясните почему не работал мой код. Как бы понятно что в плане оптимальности у меня написан полный бред(объявление цветов константами хДД), но мне бы в 1ю очередь понять как бы это сказать "механику" языка )
Код:
Case $Case =4
                                        Const $lol1=0xBE8976
                                if not $lol1=PixelGetColor($Check[0]-82, $Check[1]+372) then @error ; если константа не равна значению функции значит ошибка 
            If Not @error Then  Const $lol2=0x4F3F1F ; если в строке кода выше не ошибка значит выполняется следующий участок кода, ну и таким образом проверяются все критерии этого условия.
                                if not $lol2=PixelGetColor($Check[0]-123, $Check[1]+13) then @error
            If Not @error Then  Const $lol3=0xE6AE8D
                                if not $lol7=PixelGetColor($Check[0]+145, $Check[1]+258) then @error
            If Not @error Then Return True

То бишь главный вопрос что на самом деле происходило в коде) Повторюсь - с этим условием Pixelsherchex работал как простой Pixelsherch.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Shpilivili
почему не работал мой код
@error - это макрос. Чтобы изменить его значение нужно использовать специальную функцию
Код:
SetError()


понять как бы это сказать "механику" языка
Скачайте русскую справку, читайте её, как учебник, и разбирайте примеры.
 
Верх