Что нового

Результаты функции FFNearestSpot из UDF FastFind.au3

Yura

Знающий
Сообщения
36
Репутация
7
Возник вопрос при использовании UDF FastFind.au3 при поиске области с пикселями определенного цвета (функция FFNearestSpot). Прикрепляю демонстрационный скрипт. Ищет координаты темно-красного квадрата на панели инструментов Пейнт, передвигает курсор мыши на него и в консоль выводит инфу о координатах и количестве пикселей. У меня получился такой результат: area's coordinates = 930, 66, number of pixels found = 132. Если я задал SizeSearch = 10, то ищется квадрат со стороной 10. Как в нем может быть 132 пикселя (>100)? Я неправильно понимаю, что одной клетке с координатами (x, y) должен отвечать всего 1 пиксель, или это функция криво работает? Ответ на вопрос очень важен, потому что через величину NbPixel хотелось бы иметь возможность задавать минимальный процент пикселей искомого цвета в квадрате поиска.

Код:
#include "FastFind.au3"

HotKeySet("{F2}", "FindSpot")
HotKeySet("{ESC}", "End")

Global $color = "0x880015"; темно-красный цвет

$hwnd = WinGetHandle("Безымянный - Paint")
WinSetState($hwnd, "",@SW_MAXIMIZE)
FFSnapShot(0, 0, 0, 0, 0, $hwnd) ; скрин
opt("MouseCoordMode", 2)

While 1
  Sleep(10)
WEnd

Func FindSpot()
   $aCoords = FFNearestSpot(10 , 99, 10, 10, $color, 0 ,False, $hwnd) ;ищем темно-красный квадрат на панели
   ;SizeSearch, NbPixel, PosX, PosY, Color, ShadeVariation, ForceNewSnap, WindowHandle
   
   ;SizeSearch - The width and height of the area to search for. 
   ;NbPixel - Minimum number of pixels in the area. 

   ;Success: Returns a three-element array of area's coordinates and number of pixels found. 
   ;(Array[0] = x, Array[1] = y, Array[2] = Number of pixels found). 

   If Not @error Then
	  ConsoleWrite("area's coordinates = "&$aCoords[0]&", "&$aCoords[1]&", number of pixels found = "&$aCoords[2]&@CRLF)
	  WinActivate($hwnd)
	  MouseMove($aCoords[0], $aCoords[1], 5)
   Else
	  ConsoleWrite("Match not found."&@CRLF)
   EndIf
EndFunc

Func End()
    Exit
EndFunc


Также если кто знает алгоритм функции FFNearestPixel, дайте ссылку пожалуйста или опишите. Нужно для написания кода, чтоб искать следующий пиксель такого же цвета, но при этом выбросить из поиска область, которую проверили при поиске первого пикселя.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
А я просто убирал с изображения все не интересующие меня цвета и далее все считал в циклах :smile:. Лень было заморачиваться.
 
A

Alofa

Гость
Yura сказал(а):
... ищется квадрат со стороной 10. Как в нем может быть 132 пикселя (>100)? ...
А у меня так вообще 256,
7f5757520077de56869818cf12a1813c.png

Yura сказал(а):
... если кто знает алгоритм функции FFNearestPixel, дайте ссылку пожалуйста или опишите...
Обратитесь к первоисточнику откуда качали архив "FastFind.zip". А в архиве должна быть (и есть) справка "FastFind.chm" по пользованию функций библиотеки.
От себя могу предложить вот это:
Код:
; #include <Array.au3>

Global $color = "0x880015"; темно-красный цвет
Global $Win = '[CLASS:MSPaintApp; TITLE:Безымянный - Paint]'

$hWnd = WinWait($Win)
WinActivate($Win)
;WinSetState($hwnd, "",@SW_MAXIMIZE)

Opt('PixelCoordMode', 0)
Opt("MouseCoordMode", 0)

$WinPos = WinGetPos($Win) ; Координаты и размер окна.
$ToolBarPos = ControlGetPos($Win, '', '[ID:9249]') ; Координаты и размер ToolBar относительно окна.
$aClSize = WinGetClientSize($Win) ; Размер клиентской области окна

$Left = ($WinPos[2] - $aClSize[0]) / 2 ;  |
$Top = $WinPos[3] - $Left - $aClSize[1] ; |
$Right = $aClSize[0] + $Left ;            | => Скорректированные координаты ToolBar
$Bottom = $ToolBarPos[3] + $Top ;         |

#cs+++++++++++ Так ОООчень долго и ресурсозатратно! +++++++++
Global $Coord[0][2]
For $i = 0 To $Bottom
	For $ic = 0 To $Right
		$Pixel = PixelSearch($Left + $ic, $Top + $i, $Right, $Bottom, $color, 0, 1, $hWnd)
		If IsArray($Pixel) Then
			ReDim $Coord[UBound($Coord) + 1][2]
			$Coord[UBound($Coord) - 1][0] = $Pixel[0]
			$Coord[UBound($Coord) - 1][1] = $Pixel[1]
			If $Coord[0][0] = $Pixel[0] Then ; Уменьшаем зону поиска
				$Left = $Pixel[0]
				$Top = $Pixel[1]
			EndIf
		EndIf
	Next
Next
_ArrayDisplay($Coord, 'Массив $Coord')
#ce++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;++++++++++++++++++ А так побыстрей! ++++++++++++++++++++++
Do
	$Pixel = PixelSearch($Left, $Top, $Right, $Bottom, $color, 0, 1, $hWnd)
	If @error = 1 Then ExitLoop
Until IsArray($Pixel)
$Coord_X1 = $Pixel[0]
$Coord_Y1 = $Pixel[1]

Do
	$Pixel = PixelSearch($Right, $Bottom, $Left, $Top, $color, 0, 1, $hWnd)
	If @error = 1 Then ExitLoop
Until IsArray($Pixel)
$Coord_X2 = $Pixel[0]
$Coord_Y2 = $Pixel[1]
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
MouseMove($Coord_X2, $Coord_Y2)

$Width = $Coord_X2 - $Coord_X1 + 1
$Height = $Coord_Y2 - $Coord_Y1 + 1
$Pixels = $Width * $Height

ConsoleWrite(@CR & 'X координата = ' & $Coord_X1 & @CR & 'Y координата = ' & $Coord_Y1 & @CR & _
		'Ширина = ' & $Width & @CR & 'Высота = ' & $Height & @CR & 'Количество пикселей = ' & $Pixels & @CR & @CR)
 
Автор
Y

Yura

Знающий
Сообщения
36
Репутация
7
Alofa сказал(а):
А у меня так вообще 256
Или я вас не понял или вы меня.

в архиве должна быть (и есть) справка "FastFind.chm" по пользованию функций библиотеки.
Это то, что я сделал перед тем, как задать вопрос.
FFNearestPixel ( PosX, PosY, Color [, ForceNewSnap [, Left [, Top [, Right [, Bottom [, NoSnapShot [, WindowHandle]]]]]]] )
Кроме того, что ищется "ближайший" пиксель цвета "Color" к точке с координатами (PosX, PosY) в справке ничего нету. Алгоритм поиска запрятан в dll, а в ассемблере я ее колупать не буду. Я уже сам проверил, действительно возвращает координаты ближайшего пикселя по прямой, соединяющей координаты точек начала и конца поиска.

От себя могу предложить вот это:
Вы используете PixelSearch, а он считывает с экрана. Мне надо с перекрытого окна или окна сдвинутого за границы монитора, поэтому использую либу FastFind. Кроме того PixelSearch настолько меееедленеее FFNearestPixel (где время поиска измеряется в нескольких милисекундах).
Спасибо, конечно, за труды, но меня интересуют только ответы на конкретные вопросы в начале темы, альтернатив предлагать не надо. Через PixelSearch или используя WinAPI могу написать сам, но не устраивает ни по скорости, ни по работе в перекрытых окнах. Интересует только какую зону можно добавить через FFAddExcludedArea после каждого поиска, чтоб выключить ее из повторного поиска через FFNearestPixel и FFNearestSpot на том же скрине.
 
A

Alofa

Гость
OffTopic:
Yura сказал(а):
... меня интересуют только ответы на конкретные вопросы в начале темы ...
А где там хоть слово про это:
... Мне надо с перекрытого окна или окна сдвинутого за границы монитора ...
И в примере вашем
Код:
WinSetState($hwnd, "",@SW_MAXIMIZE)

тоже как бы и намека на это нет.
 
Автор
Y

Yura

Знающий
Сообщения
36
Репутация
7
Alofa сказал(а):
А где там хоть слово про это:
... Мне надо с перекрытого окна или окна сдвинутого за границы монитора ...
И в примере вашем
Вот именно, в примере. Демонстрационный скрипт - пример для того, чтоб показать какое количество пикселей выдает FFNearestSpot! Чтоб люди могли его запустить и посмотреть результат не делая собственного скрипта. Или вы реально думаете, что у меня задача искать цвета в тулбаре Пейнта? ;D На базе этой либы у меня написан рабочий бот для 3Д игры, только оптимизировать и ускорить поиски хочется.
Я задал 2 конкретных вопроса о FFNearestSpot и FFNearestPixel, зачем мне было уточнять в каких окнах работаю- это никак не влияет на алгоритмы их работы, которые меня интересуют. Не знаю с чего вы решили предлагать мне PixelSearch и читать справку. Названия темы "Результаты функции FFNearestSpot из UDF FastFind.au3" тоже как бы толсто намекает.
 
A

Alofa

Гость
OffTopic:
Yura сказал(а):
... зачем мне было уточнять в каких окнах работаю- это никак не влияет на алгоритмы их работы, которые меня интересуют...
Я к тому что если бы вы сразу писали о поиске пикселей в перекрытых окнах, то я бы даже и не пытался что-то заворганить. А так как о FastFind.au3 только слышал, но дела не имел, то попытался помочь PixelSearch.
 
Автор
Y

Yura

Знающий
Сообщения
36
Репутация
7
Alofa сказал(а):
А так как о FastFind.au3 только слышал, но дела не имел, то попытался помочь тем что знаю.

Спасибо за старания в любом случае :smile: Я, если на честно, слабо надеюсь, что кто-то, кроме разработчика и еще немногих людей знают алгоритм работы этих функций и ответят здесь... По всему похоже, что проще будет самому написать либу для поиска изображений, пикселей и групп пикселей (не на AutoIt, конечно), чем мучатся с FastFind, альтернативы которому не нашел, а функционал не устраивает.
 
Верх