Что нового

PixelSearch.Как бует более эффективнее?

alt-andrew

Новичок
Сообщения
19
Репутация
2
Доброго времени суток.Вот возникло пару вопросов по PixelSearch:
1.Как будет более эффективно производить поиск пикселя по области на рис1 или по отдельным облостям рис2?

Рис1: Рис2:
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 596
Репутация
938
Я ищу как на рисунке два.
Второй вопрос не понял.


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

Если изображения одинаковые то и ищи одни и те же пиксели


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

А лучше скажи что сделать пытаешься.
 
Автор
A

alt-andrew

Новичок
Сообщения
19
Репутация
2
Belfigor сказал(а):
Я ищу как на рисунке два.
Второй вопрос не понял.


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

Если изображения одинаковые то и ищи одни и те же пиксели


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

А лучше скажи что сделать пытаешься.





Вот изображение со штанами там 3 картинки в 1,у них разница небольшая,визуально цифра в углу.как для каждой картинки найти уникальный (индивидуальный) писксель?
По поводу первого-как реализовать проверку заданного пикселя во всех областях(если как на рис2) и если он есть,то кликнуть на него?
для рис1 как-то так сделал:
Код:
$coord =PixelSearch( 650, 155, 715, 495,0xDCD7D3)	
If NOT @error Then MouseClick("left", $coord[0], $coord[1],2,0)
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 596
Репутация
938
обозначь необходимую тебе область в виде ячейки и задай между ними расстояние если у тебя 3 абсолютно идентичные картинки то смысл искать там уникальный пиксель например считай число чтобы обозначить ячейку просто вычисли ту область которую тебе необходимо обследовать и жестко укажи ее при поиске надеюсь прочтение этого сообщения вынесет тебе моск и ты хотя бы запятые с точками начнешь расставлять нормально в своих сообщениях иначе читая их очень сложно уловить то о чем таки ты спрашиваешь
 
Автор
A

alt-andrew

Новичок
Сообщения
19
Репутация
2
Belfigor
По поводу первого-Вот на рис2 6 товаров,как реализовать проверку заданного пикселя во всех областях с товаром и если он есть,то кликнуть на него?
 

Belfigor

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

alt-andrew

Новичок
Сообщения
19
Репутация
2
Belfigor
А подскажи как текст считать?
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 596
Репутация
938
http://autoit-script.ru/index.php?topic=261.0
Почитай эту тему, там есть некоторые посты в которых указывается направление в котором надо искать. В остальном же это - разработка к которой в нашем разделе присвоен статус "сделай сам" исходники OCR для игр написанные чисто на автоит тебе никто не даст, примеров же с использованием внешних OCR движков и так на форуме достаточно.
 
Автор
A

alt-andrew

Новичок
Сообщения
19
Репутация
2
Ну подскажите.Вот есть форма с checkbox_ами, как проверить отмечен ли и передать если отмечен значение в массив,для дальнейшего извличения в PixelSearch?
Делаю вот так:
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 147, 161, -1, -1)
$Checkbox1 = GUICtrlCreateCheckbox("Checkbox1", 24, 16, 81, 25)
$Checkbox2 = GUICtrlCreateCheckbox("Checkbox2", 24, 44, 81, 25)
$Button1 = GUICtrlCreateButton("Button1", 24, 88, 97, 33)
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button1
            If GUICtrlRead($Checkbox1) = 1 Then
                $iCheck1 = "0x3D1700"
            Else
                $iCheck1 = "0"
			EndIf
            If GUICtrlRead($Checkbox2) = 1 Then
                $iCheck2 = "0xDCD7D3"
            Else
                $iCheck2 = "0"
            EndIf
			proverka()
	EndSwitch
WEnd
Func proverka()
;тут активация нужного она для проверки...
Local $pixel[2] = [$iCheck1,$iCheck2]
	For $i = 0 to 1 
            $coord =PixelSearch( 650, 155, 715, 495,$pixel[$i])
If NOT @error Then 
    MouseClick("left", $coord[0], $coord[1],2,0)
Else
	MsgBox(0, "", "Цвет "&$pixel[$i]&" не найден.", 5)
EndIf
	Next
EndFunc
Но так не очень подходит,если не отмечен CheckBox,то передается "0" и происходит поиск "черного цвета".Можно как-то при проверке чекбокса,если отмечен передавать его в массив,а если не отмечен чтоб его в массиве не было?

OffTopic:
И еще вот такой вопрос:Какой может быть максимальная размерность массива?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
alt-andrew
у каждого чекбокса есть идентификатор (назовем его $hCheckBox), который задается при его создании.
Состояние чекбокса опрашивается с помощью функции - GUICtrlRead($hCheckBox)
если
Код:
GUICtrlRead($hCheckBox) = $GUI_CHECKED

значит чекбокс отмечен, и

Код:
GUICtrlRead($hCheckBox) = $GUI_UNCHECKED

в противном случае

не очень понятно, что конкретно ты делаешь и какие сложности у тебя возникают
И еще вот такой вопрос:Какой может быть максимальная размерность массива?
определяется (или вернее ограничевается) размером оперативной памяти.
 
Автор
A

alt-andrew

Новичок
Сообщения
19
Репутация
2
Я пытаюсь сделать следующее-Проверить чекбоксы и передать отмеченные в массив,а далее из массива по 1-му передать PixelSearch на проверку.
вот так проверяю:
Код:
If GUICtrlRead($Checkbox1) = $GUI_CHECKED Then
                $iCheck1 = "0x3D1700"

далее надо передать значение в массив,который будет состоять из отмеченных чекбоксов
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
alt-andrew [?]
далее надо передать в значение в массив,который будет состоять из отмеченных чекбоксов
ну дак, передавай в массив. зачем в переменную пихаешь?
Проинициализируй вначале сам массив, а потом после проверки передавай
Код:
If GUICtrlRead($Checkbox1) = $GUI_CHECKED Then
                $array[$i] = "0x3D1700"



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

если проблема в точном определении массива заранее, то тут есть два варианта
1. определить массив размерностью заведомо больше чем может получиться в задаче
2. определить минимальный массив состоящий из одного элемента, а потом если надо передать значение увеличиваешь размерность на 1 через ReDim
 
Автор
A

alt-andrew

Новичок
Сообщения
19
Репутация
2
OffTopic:
не судите строго.Я пока новичек и не могу пока сформулировать конкретный вопрос(задачу)

У меня есть 16 чекбоксов,мне надо отмеченные передать в массив,а потом по 1-му передать для поиска в PixelSearch.Если можно пример,хотябы для 2-х чекбоксов.
Зараннее Спасибо!
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
alt-andrew
Попробуйте так:
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Array.au3>

Global $sColors = '0x3D1700|0x3D1701|0x3D1702|0x3D1703|0x3D1704'
Global Const $aColors = StringSplit($sColors, '|')
Global $anCheckBoxes[$aColors[0] + 1]

$Form1 = GUICreate("", 100, 150, -1, -1)
$iTop = 10
For $i = 1 To $aColors[0]
	$anCheckBoxes[$i] = GUICtrlCreateCheckbox($aColors[$i], 10, $iTop, 100, 15)
	$iTop += 20
Next
$Button1 = GUICtrlCreateButton("Button1", 10, 110, 80, 25)
GUISetState()

While 1
	$nMsg = GUIGetMsg()

	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			Dim $aChecks[1]
			For $i = 1 To $aColors[0]
				If GUICtrlRead($anCheckBoxes[$i]) = 1 Then
					_ArrayAdd($aChecks, $aColors[$i])
					$aChecks[0] += 1
				EndIf
			Next
			_ArrayDisplay($aChecks)
			For $iI = 1 To $aChecks[0]
				$coord = PixelSearch(0, 0, 20, 300, $aChecks[$iI])
				If Not @error Then
					MsgBox(0, $iI, "X: " & $coord[0] & ", Y: " & $coord[1])
				Else
					MsgBox(0, $iI, "No")
				EndIf
			Next
	EndSwitch
WEnd
 
Верх