Что нового

Определение количества одинаковых объектов (рисунков) в одной области поиска

mr.Gbabak

Осваивающий
Сообщения
257
Репутация
23
Привет форумчанам!
Итак суть проблемы такова: в окне есть определенная область, которая содержит некоторое количество одинаковых объектов(рисунков, группы пикселей, см.рисунок) и которые могут менять свое расположение и кол-во.
Как посчитать количество этих объектов и их координаты (любого пикселя из которых состоит этот объект)?
 

Вложения

  • primer.png
    primer.png
    947 байт · Просмотры: 17

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
mr.Gbabak
Как вариант:
http://autoit-script.ru/index.php?topic=14069.msg88913#msg88913
 
Автор
M

mr.Gbabak

Осваивающий
Сообщения
257
Репутация
23
WSWR
т.е поиск по картинке?...Почему-то у меня к такому методу предубеждение, но попробую.
А может быть есть еще какие-нибудь идеи?


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

Ну, а если попробовать найти все пиксели определенного цвета?
Те пиксели, которые имеют в своем окружении идентичные, считать одним объектом.
А как найти все пиксели одного цвета в определенной области?
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Автор
M

mr.Gbabak

Осваивающий
Сообщения
257
Репутация
23
Да как-то?!!
Я же искал по поиску и ни чего не нашел!!! :search:
Код:
#include <Array.au3>
#include <WinAPIEx.au3>
#include <WindowsConstants.au3>

$t = TimerInit()
WinActivate ("[CLASS:Photo_Lightweight_Viewer]")
WinWaitActive ("[CLASS:Photo_Lightweight_Viewer]")


$arr = _PixelGetArray(228, 204, 106, 46, 0x22B14C); задаются координаты  области поиска, длина и ширина

ConsoleWrite(TimerDiff($t) & @LF)
toPoint()
_ArrayDisplay($arr)

Func _PixelGetArray($iX, $iY, $iWidth, $iHeight, $iColor, $hWnd = WinWait('primer.png'))
    Local $aPixels[$iWidth * $iHeight + 1][2]
    Local $hDC = _WinAPI_GetDC($hWnd)
    Local $hMemDC = _WinAPI_CreateCompatibleDC($hDC)
    Local $hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $iWidth, $iHeight)
    _WinAPI_SelectObject($hMemDC, $hBitmap)
    _WinAPI_BitBlt($hMemDC, 0, 0, $iWidth, $iHeight, $hDC, $iX, $iY, $SRCCOPY)
    _WinAPI_DeleteDC($hMemDC)
    _WinAPI_ReleaseDC($hWnd, $hDC)
    Local $iSize = $iWidth * $iHeight
    Local $tBits = DllStructCreate("dword[" & $iSize & "]")
    _WinAPI_GetBitmapBits($hBitmap, 4 * $iSize, DllStructGetPtr($tBits))
    Local $iCount = 0
    For $i = 1 To $iSize
        If BitAND(DllStructGetData($tBits, 1, $i), 0x00FFFFFF) = $iColor Then
            $iCount += 1
            $aPixels[$iCount][0] = Mod($i, $iWidth) - 1
            If $aPixels[$iCount][0] = -1 Then $aPixels[$iCount][0] = $iWidth - 1
            $aPixels[$iCount][1] = Ceiling($i / $iWidth) - 1
        EndIf
    Next
    ReDim $aPixels[$iCount + 1][2]
    $aPixels[0][0] = $iCount
    Return $aPixels
EndFunc   ;==>_PixelGetArray

Func toPoint()
	Local $e=1
   $i=1
   While $i < UBound($Arr)
      For $j=0 To $i-1
         If (Abs($Arr[$i][0]-$Arr[$j][0]) <= $e And Abs($Arr[$i][1]-$Arr[$j][1]) <= $e) Then
            _ArrayDelete($Arr, $j)
            $i -= 2
            ExitLoop
         EndIf
      Next
      $i += 1
   WEnd
EndFunc
 
Верх