Что нового

нужен алгоритм по поиску пикселей

S_K

Новичок
Сообщения
30
Репутация
0
Версия AutoIt: 3.3.12

Описание:

нужно найти определенный квадрат на картинке и кликать по красной точке внутри него

например находим красною точку, от нее в радиусе 50 пикселей проверяем есть ли цвета: синий, фиолетовый, зеленый, если есть тогда кликаем по красной точке внутри этого квадрата
 

Вложения

  • Безымянный.png
    Безымянный.png
    6 КБ · Просмотры: 30

qqww22

Новичок
Сообщения
115
Репутация
4
Вот тебе пример на цвете красный и голубой.
Дальше сам.
Код:
HotKeySet("{ESC}", "Terminate")
HotKeySet("{F2}", "MousGetpo")
HotKeySet("{F3}", "Find")

global $red = 0x00EA282E
global $blue = 0x002B9CE7
global $purple = 0x00A244A2
global $green = 0x00B2EA26
global $green2 = 0x0028B24D


Global $Paused
Func Terminate()
    Exit 0
EndFunc


Func MousGetpo() ; берем цвет
  $xk=MouseGetPos()
  $clck=$xk[0]&","&$xk[1]&@CRLF
  $pix="0x"&hex(PixelGetColor($xk[0],$xk[1]),7)
  ConsoleWrite(@CR&$pix)
EndFunc

Func find()
  $s=PixelSearch(0,0,1280,1024,$red,2) ;ищем красный
  if IsArray($s) = True then
  ConsoleWrite($s[0])
  ConsoleWrite($s[1])
  $s1=PixelSearch(0,0,$s[0]+50,$s[1]+50,$blue,2);ищем голубой
   if IsArray($s1) = True then
ConsoleWrite($s1[0])
ConsoleWrite($s1[1])
MouseMove($s[0],$s[1],0)
 endif
Else
  ConsoleWrite(@CR&"JOOOPA")
return
endif
  EndFunc

while 1
  sleep(10)
  WEnd
 
Автор
S_K

S_K

Новичок
Сообщения
30
Репутация
0
qqww22 сказал(а):
Вот тебе пример на цвете красный и голубой.

не работает если первым стоит просто красной а через 500 пикселей красной и голубой

Код:
HotKeySet("{ESC}", "Terminate")
HotKeySet("{F3}", "Find")

Func Terminate()
    Exit 0
EndFunc



Func Find()
  $s=PixelSearch(0,0,@DesktopWidth,@DesktopHeight,0xED1C24,2) ;ищем красный
  if IsArray($s) = True then
  ConsoleWrite("Цвет 1 " & $s[0] & "," &$s[1] &@CRLF)

  $s1=PixelSearch($s[0]-50,$s[1]-50,$s[0]+50,$s[1]+50,0x00A2E8,2);ищем голубой
   if IsArray($s1) = True then
  ConsoleWrite("Цвет 2 " & $s1[0] & "," &$s1[1] &@CRLF)

   MouseMove($s[0],$s[1],0)
 endif
Else
  ConsoleWrite(@CR&"Oops!")
return
endif
  EndFunc

while 1
  sleep(10)
  WEnd
 

Вложения

  • 2.png
    2.png
    1.5 КБ · Просмотры: 17

qqww22

Новичок
Сообщения
115
Репутация
4
Код:
HotKeySet("{ESC}", "Terminate")
HotKeySet("{F2}", "MousGetpo")
HotKeySet("{F3}", "Find")

global $red = 0x00EA282E
global $blue = 0x002B9CE7
global $purple = 0x00A244A2
global $green = 0x00B2EA26
global $green2 = 0x0028B24D


Global $Paused
Func Terminate()
    Exit 0
EndFunc


Func MousGetpo() ; берем цвет
  $xk=MouseGetPos()
  $clck=$xk[0]&","&$xk[1]&@CRLF
  $pix="0x"&hex(PixelGetColor($xk[0],$xk[1]),7)
  ConsoleWrite(@CR&$pix)
EndFunc

Func find()
  $s=PixelSearch(0,0,1280,1024,$red,2) ;ищем красный
  if IsArray($s) = True then
  ConsoleWrite($s[0])
  ConsoleWrite($s[1])
  
 $s1=PixelSearch($s[0]-150,$s[1]-150,$s[0]+150,$s[1]+150,$blue,2);ищем голубой
   if IsArray($s1) = True then
ConsoleWrite($s1[0])
ConsoleWrite($s1[1])
MouseMove($s[0],$s[1],0)
ConsoleWrite(@CR&"FOUND")
return
 endif
Else
  ConsoleWrite(@CR&"next scan")
endif


$s=PixelSearch($s[0]+20,$s[1]+20,1280,1024,$red,2) ;ищем красный
if IsArray($s) = True then
ConsoleWrite(@CR&$s[0])
ConsoleWrite(@CR&$s[1])
$s1=PixelSearch($s[0]-150,$s[1]-150,$s[0]+150,$s[1]+150,$blue,2);ищем голубой
if IsArray($s1) = True then
ConsoleWrite($s1[0])
ConsoleWrite($s1[1])
MouseMove($s[0],$s[1],0)
ConsoleWrite(@CR&"FOUND")
return
 endif
Else
  ConsoleWrite(@CR&"next scan")
endif



  EndFunc

while 1
  sleep(10)
  WEnd
 

Ksaan

Знающий
Сообщения
207
Репутация
15
Вот мой вариант, написаный на коленке.
Код:
$Part_1 = 0
$Part_2 = @DesktopWidth / 2
$Part_3 = @DesktopHeight / 2

$Pixel_Search_1 = PixelSearch($Part_1, $Part_1, $Part_2, $Part_3, 0xEA282E, 2)
$Pixel_Search_2 = PixelSearch($Part_2, $Part_1, @DesktopWidth, $Part_3, 0xEA282E, 2)
$Pixel_Search_3 = PixelSearch($Part_1, $Part_3, $Part_2, @DesktopHeight, 0xEA282E, 2)
$Pixel_Search_4 = PixelSearch($Part_2, $Part_3, @DesktopWidth, @DesktopHeight, 0xEA282E, 2)

;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

PixelSearch($Pixel_Search_1[0] - 50, $Pixel_Search_1[1] - 50, $Pixel_Search_1[0] + 50, $Pixel_Search_1[1] + 50, 0x2B9CE7, 2) ;blu
If Not @error Then
	PixelSearch($Pixel_Search_1[0] - 50, $Pixel_Search_1[1] - 50, $Pixel_Search_1[0] + 50, $Pixel_Search_1[1] + 50, 0x28B24D, 2)   ; green
	If Not @error Then
		PixelSearch($Pixel_Search_1[0] - 50, $Pixel_Search_1[1] - 50, $Pixel_Search_1[0] + 50, $Pixel_Search_1[1] + 50, 0xA244A2, 2); purple
		If Not @error Then
			MouseClick("left", $Pixel_Search_1[0], $Pixel_Search_1[1])
			ConsoleWrite("1" & @CRLF)
		EndIf
	EndIf
EndIf

PixelSearch($Pixel_Search_2[0] - 50, $Pixel_Search_2[1] - 50, $Pixel_Search_2[0] + 50, $Pixel_Search_2[1] + 50, 0x2B9CE7, 2) ;blue
If Not @error Then
	PixelSearch($Pixel_Search_2[0] - 50, $Pixel_Search_2[1] - 50, $Pixel_Search_2[0] + 50, $Pixel_Search_2[1] + 50, 0x28B24D, 2)   ; green
	If Not @error Then
		PixelSearch($Pixel_Search_2[0] - 50, $Pixel_Search_2[1] - 50, $Pixel_Search_2[0] + 50, $Pixel_Search_2[1] + 50, 0xA244A2, 2); purple
		If Not @error Then
			MouseClick("left", $Pixel_Search_2[0], $Pixel_Search_2[1])
			ConsoleWrite("2" & @CRLF)
		EndIf
	EndIf
EndIf

PixelSearch($Pixel_Search_3[0] - 50, $Pixel_Search_3[1] - 50, $Pixel_Search_3[0] + 50, $Pixel_Search_3[1] + 50, 0x2B9CE7, 2) ;blue
If Not @error Then
	PixelSearch($Pixel_Search_3[0] - 50, $Pixel_Search_3[1] - 50, $Pixel_Search_3[0] + 50, $Pixel_Search_3[1] + 50, 0x28B24D, 2)   ; green
	If Not @error Then
		PixelSearch($Pixel_Search_3[0] - 50, $Pixel_Search_3[1] - 50, $Pixel_Search_3[0] + 50, $Pixel_Search_3[1] + 50, 0xA244A2, 2); purple
		If Not @error Then
			MouseClick("left", $Pixel_Search_3[0], $Pixel_Search_3[1])
			ConsoleWrite("3" & @CRLF)
		EndIf
	EndIf
EndIf

PixelSearch($Pixel_Search_4[0] - 50, $Pixel_Search_4[1] - 50, $Pixel_Search_4[0] + 50, $Pixel_Search_4[1] + 50, 0x2B9CE7, 2) ;blue
If Not @error Then
	PixelSearch($Pixel_Search_4[0] - 50, $Pixel_Search_4[1] - 50, $Pixel_Search_4[0] + 50, $Pixel_Search_4[1] + 50, 0x28B24D, 2)   ; green
	If Not @error Then
		PixelSearch($Pixel_Search_4[0] - 50, $Pixel_Search_4[1] - 50, $Pixel_Search_4[0] + 50, $Pixel_Search_4[1] + 50, 0xA244A2, 2); purple
		If Not @error Then
			MouseClick("left", $Pixel_Search_4[0], $Pixel_Search_4[1])
			ConsoleWrite("4" & @CRLF)
		EndIf
	EndIf
EndIf
 
Автор
S_K

S_K

Новичок
Сообщения
30
Репутация
0
qqww22 сказал(а):
Код:
HotKeySet("{ESC}", "Terminate")
HotKeySet("{F2}", "MousGetpo")
HotKeySet("{F3}", "Find")

global $red = 0x00EA282E
global $blue = 0x002B9CE7
global $purple = 0x00A244A2
global $green = 0x00B2EA26
global $green2 = 0x0028B24D


Global $Paused
Func Terminate()
    Exit 0
EndFunc


Func MousGetpo() ; берем цвет
  $xk=MouseGetPos()
  $clck=$xk[0]&","&$xk[1]&@CRLF
  $pix="0x"&hex(PixelGetColor($xk[0],$xk[1]),7)
  ConsoleWrite(@CR&$pix)
EndFunc

Func find()
  $s=PixelSearch(0,0,1280,1024,$red,2) ;ищем красный
  if IsArray($s) = True then
  ConsoleWrite($s[0])
  ConsoleWrite($s[1])
  
 $s1=PixelSearch($s[0]-150,$s[1]-150,$s[0]+150,$s[1]+150,$blue,2);ищем голубой
   if IsArray($s1) = True then
ConsoleWrite($s1[0])
ConsoleWrite($s1[1])
MouseMove($s[0],$s[1],0)
ConsoleWrite(@CR&"FOUND")
return
 endif
Else
  ConsoleWrite(@CR&"next scan")
endif


$s=PixelSearch($s[0]+20,$s[1]+20,1280,1024,$red,2) ;ищем красный
if IsArray($s) = True then
ConsoleWrite(@CR&$s[0])
ConsoleWrite(@CR&$s[1])
$s1=PixelSearch($s[0]-150,$s[1]-150,$s[0]+150,$s[1]+150,$blue,2);ищем голубой
if IsArray($s1) = True then
ConsoleWrite($s1[0])
ConsoleWrite($s1[1])
MouseMove($s[0],$s[1],0)
ConsoleWrite(@CR&"FOUND")
return
 endif
Else
  ConsoleWrite(@CR&"next scan")
endif



  EndFunc

while 1
  sleep(10)
  WEnd

когда 2 красные точки - хорошо, а если больше, например больше 100, мне что для каждой писать PixelSearch
знаю что можно реализовать с помощью цикла вопрос лишь как
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
OffTopic:
qqww22 [?]
Господа!
Этот раздел называется "Стол заказов"!
IMHO: Из этого следует, что всё за человека делаете вы.
 

Ksaan

Знающий
Сообщения
207
Репутация
15
S_K сказал(а):
знаю что можно реализовать с помощью цикла вопрос лишь как
Разбей экран на квадраты и последовательно проверяй каждый квадрат. Это не сложно 10 минут работы
Код:
$Part_1 = @DesktopWidth / 10	; делим ширину экрана на сколько частей хотим разбить
$Part_2 = @DesktopHeight / 10	; делим высоту экрана на сколько частей хотим разбить

Или тему в Стол заказов ;)
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Ksaan [?]
Или тему в Стол заказов
wink.gif
Вы кроме своих ответов другие читаете? UP
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Код:
#Include <GDIPlus.au3>

_GDIPlus_Startup()

Local Const $qSize = 50 ;Ширина/Высота квадрата
Local Const $qColor = 0xFF0000 ;Цвет квадрата
Local Const $iArea = 50 ; "квадратный" радиус поиска цветов
Local Const $aColors[3] = [ 2, 0xXXX, 0xXXX ] ;Цвета для поиска в регионе

Local $hImg, $iW, $iH, $tRes, $aPixel
; ---
$hImg = _GDIPlus_ImageLoadFromFile( ... ) ;Или скриншот
$iW = _GDIPlus_ImageGetWidth($hImg)
$iH = _GDIPlus_ImageGetHeight($hImg)

$tRes = _GDIPlus_BitmapLockBits($hImg, 0, 0, $iW, $iH, $GDIP_ILMREAD, $GDIP_PXF32ARGB)
If Not IsDllStruct( $tRes ) Then _
	Exit 1

; <<
Local $cX = 0, $cY = 0, _
	$cW = $tRes.Width - ( $qSize + 1 ), _
	$cH = $tRes.Height - ( $qSize + 1 ), _
	$a_qCenter[2]
While 1
	$aPixel = _PixelSearch( $tRes, $cX, $cY, $cW, $cH, $qColor )
	If Not @Error Then
		If _GetPixel( $tRes, $aPixel[0] + $qSize - 1, $aPixel[1] + $qSize - 1 ) = $qColor Then ;Найден квадрат
			;Получаем центр квадрата
			$a_qCenter[0] = $aPixel[0] + Floor( $qSize / 2 )
			$a_qCenter[1] = $aPixel[1] + Floor( $qSize / 2 )

			;Ищем в "квадратном радиусе" 50 пикселей от центра XYZ цвет
			If _
				$a_qCenter[0] + $iArea < $tRes.Width And _
				$a_qCenter[1] + $iArea < $tRes.Height _
			Then
				For $s = 1 To $aColors[0] Step 1
					_PixelSearch( $tRes, _
						$a_qCenter[0] - $iArea, _
						$a_qCenter[1] - $iArea, _
						( $iArea * 2 ) + 1, _
						( $iArea * 2 ) + 1, _
						$aColors[$s] )

					If Not @Error Then ;Цвет обнаружен
						;Обнаружен подходящий квадрат, его центр:
						;$a_qCenter[0] - X
						;$a_qCenter[1] - Y

						ExitLoop
					EndIf
				Next
			EndIf
		EndIf

		;Пропускаем потенциальную область
		$cX += $qSize
		If $cX > $cW Then
			$cX = 0
			$cY += 1
			If $cY > $cH Then _
				ExitLoop
		EndIf
	Else
		ExitLoop
	EndIf
WEnd

_GDIPlus_BitmapUnlockBits($hImg, $tRes)
_GDIPlus_ImageDispose($hImg)
_GDIPlus_Shutdown()

Func _PixelSearch( ByRef $tData, $X, $Y, $W, $H, $vColor )
	If Not IsDllStruct( $tData ) Or _
		( $X + $W ) > $tData.Width Or _
		( $Y + $H ) > $tData.Height _
	Then _
		Return SetError( 1, 0, 0 )
	; *
	If Not $W Or Not $H Then
		$W = $tData.Width
		$H = $tData.Height
	Else
		$W += $X
		$H += $Y
	EndIf

	Local $i, $j, $aRet[2]
	; ---
	For $j = $Y To $H - 1 Step 1
		For $i = $X To $W - 1 Step 1
			If _GetPixel( $tData, $i, $j ) = $vColor Then
				$aRet[0] = $i
				$aRet[1] = $j

				Return $aRet
			EndIf
		Next
	Next
	Return SetError( 2, 0, 0 )
EndFunc


Func _GetPixel( ByRef $tData, $X, $Y )
	Local $tBuf
	; ---
	$tBuf = DllStructCreate( "dword Pixel", $tData.Scan0 + ($Y * $tData.Stride) + ($X * 0x04) )
	Return $tBuf.Pixel
EndFunc


Не проверял.
 

Ksaan

Знающий
Сообщения
207
Репутация
15
Garrett сказал(а):
Вы кроме своих ответов другие читаете? UP
Если я что-то перепечатал то это не значит что я не видел что ты написал. :mad:



Код:
HotKeySet("{F4}", "_Start")

$Part_2 = @DesktopWidth / 10	; 192
$Part_3 = @DesktopHeight / 10	; 108

Global $Part[4] = [0, 0, $Part_2, $Part_3], $X = 1, $C = 10

While 1
	Sleep(10)
WEnd

Func _Start()

	For $I = 1 To 100	; Разбиваем экран на 100 квадратов

		ToolTip($I & @CRLF & $Part[0] & @CRLF & $Part[1] & @CRLF & $Part[2] & @CRLF & $Part[3])

		$Pixel_Search_1 = PixelSearch($Part[0], $Part[1], $Part[2], $Part[3], 0xEA282E, 2)

		If IsArray($Pixel_Search_1) Then
			PixelSearch($Pixel_Search_1[0] - 50, $Pixel_Search_1[1] - 50, $Pixel_Search_1[0] + 50, $Pixel_Search_1[1] + 50, 0x2B9CE7, 2) ;blue
			If Not @error Then
				PixelSearch($Pixel_Search_1[0] - 50, $Pixel_Search_1[1] - 50, $Pixel_Search_1[0] + 50, $Pixel_Search_1[1] + 50, 0x28B24D, 2)   ; green
				If Not @error Then
					PixelSearch($Pixel_Search_1[0] - 50, $Pixel_Search_1[1] - 50, $Pixel_Search_1[0] + 50, $Pixel_Search_1[1] + 50, 0xA244A2, 2); purple
					If Not @error Then
						MouseClick("left", $Pixel_Search_1[0], $Pixel_Search_1[1])
					EndIf
				EndIf
			EndIf
		EndIf

		Switch $I
			Case $X To $C
				$Part[0] = $Part[0] + $Part_2
				$Part[2] = $Part[2] + $Part_2
				If $Part[0] = @DesktopWidth Then
					$Part[0] = 0
					$Part[1] = $Part[1] + $Part_3
					$Part[2] = $Part_2
					$Part[3] = $Part[3] + $Part_3
				EndIf
		EndSwitch
		If $I = $C Then
			$X = $X + 10
			$C = $C + 10
		EndIf
	Next
	Exit

EndFunc		;==>_Start
 

qqww22

Новичок
Сообщения
115
Репутация
4
Garrett сказал(а):
IMHO: Из этого следует, что всё за человека делаете вы.[/off]
Прости засранца не вели банить, я учился кодить на твоих постах :-[


S_K сказал(а):
когда 2 красные точки - хорошо, а если больше, например больше 100, мне что для каждой писать PixelSearch
знаю что можно реализовать с помощью цикла вопрос лишь как
Я с твоими запросами побеДЮ алкоголизм в выходные :smile:

Наслаждайся

Код:
HotKeySet("{ESC}", "Terminate")
HotKeySet("{F2}", "MousGetpo")
HotKeySet("{F3}", "Find")

global $red = 0x00EA282E
global $blue = 0x002B9CE7
global $purple = 0x00A244A2
global $green = 0x00B2EA26
global $green2 = 0x0028B24D


Global $Paused
Func Terminate()
    Exit 0
EndFunc


Func MousGetpo() ; берем цвет
  $xk=MouseGetPos()
  $clck=$xk[0]&","&$xk[1]&@CRLF
  $pix="0x"&hex(PixelGetColor($xk[0],$xk[1]),7)
  ConsoleWrite(@CR&$pix)
EndFunc



func find()
  $x = 0
  $y = 0
  $xx = 0
  $zz = 0
  while 1
;~     ConsoleWrite(@CR&$x)
;~     ConsoleWrite(@CR&$y)
    $s=PixelSearch($x,$y,1280,1024,$red,2,2)
    if not @error then 
    if $s[0] <> $xx then
      
;~       СУДА МЫ ПИШЕМ ПРОВЕРКИ НА ДРУГИЕ ЦВЕТА!!! И ЗАКРЫВАЕМ ИХ ИФОМ ШАС ОН ПЕРЕКЛИКАЕТ ВСЕ КРАСНЫЕ ГДЕ ЕСТЬ ГОЛУБЫЕ!
      $s1=PixelSearch($s[0]-150,$s[1]-150,$s[0]+150,$s[1]+150,$blue,2);ищем голубой
      if not @error then 
      
;~       $s1=PixelSearch($s[0]-150,$s[1]-150,$s[0]+150,$s[1]+150,$green,2);ищем Зелёный
;~       if not @error then       
        
        
        
        
    ConsoleWrite(@CR&$s[0]&" ; "&$s[1])
    MouseMove($s[0],$s[1],5)
;~     ВОТ ТУТ МЫ ЗАКРЫВАЕМ ПРОВЕРКУ ИФОМ
;~   endif ;~это закрытие зелёнго!
  endif
  endif
  endif
    $y += 25
    if $y > 1024 Then
      if $x > 1280 then ExitLoop
      $y = 0
      $x+=1280
    endif
        if not @error then 
$xx = $s[0]
endif
  wend
endfunc

while 1
  sleep(10)
  WEnd
 
Верх