Что нового

[Автоматизация] Детектор Лица, как повысить скорость детектирования

snezzok

bulatenok_64rus
Сообщения
12
Репутация
0
Работая в охранном бизнесе, и в конец обленившись напрограмировал скрипт, который детектирует движение, определяет физиономию и открывает электронный замок двери. Дак вот, если с 1 и 3-им пунктом уже всё оттестировано и работает, то со вторым, ну прям бяда!

Если проверяемых лиц (фото) меньше 100, то скорость определения приемлемая, но в моём случае их более 600! И тут скорость детектирования достигает 0.4-1 мин, что не приемлемо.

Уважаемые гуру autoit-а помогите увеличить скорость.

Пы.Сы.
Желаемая скорость должна быть в районе 15-20 сек., а то аборигены ругаться будут.

Код:
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>

$form2=GUICreate("WcFd",642,262,-1,1)
$pic_Find=GUICtrlCreatePic('',1,1,320,240)
$pic_Result=GUICtrlCreatePic('',321,1,320,240)
$in_sum=GUICtrlCreateInput('',1,241,50,19)
$in_result=GUICtrlCreateInput('',53,241,50,19)
GUISetState(@SW_SHOW)

WcFd()

Do
Until GUIGetMsg() = -3

Func WcFd()
	$St=50
		;=========================== Matrix 1 =================================
$path_Find=FileOpenDialog('',@DesktopDir,'(*.jpg)',1)
GUICtrlSetImage($pic_Find,$path_Find)
_GDIPlus_Startup()
$hSource =_GDIPlus_ImageLoadFromFile($path_Find)
$W = _GDIPlus_ImageGetWidth ($hSource)
$H = _GDIPlus_ImageGetHeight ($hSource)
$hClone = _GDIPlus_BitmapCloneArea($hSource,0,0,$W,$H,$GDIP_PXF24RGB)
Dim $matrix1[$H/$St][$W/$St]
	For $mat_Y= 0 To $H/$St-1
		For $mat_X= 0 To $W/$St-1
            $RGB = _GDIPlus_BitmapGetPixel($hClone,$mat_X*$St,$mat_Y*$St)
			$hex='0x'&Hex($RGB,6)
			$matrix1[$mat_Y][$mat_X]=$hex
		Next
	Next
;---------------------------------
_GDIPlus_ImageDispose ($hSource)
_GDIPlus_ImageDispose ($hClone)
_GDIPlus_Shutdown()
;======================================================================
$sPath=FileSelectFolder('Detect face',@DesktopDir,1)
$hSearch = FileFindFirstFile($sPath & '\*.jpg')
While 1
	$r=0
$path_Result = FileFindNextFile($hSearch)
If $path_Result = '' Then ExitLoop
GUICtrlSetImage($pic_Result,$path_Result)
_GDIPlus_Startup()
$hSource =_GDIPlus_ImageLoadFromFile($path_Result)
$W = _GDIPlus_ImageGetWidth ($hSource)
$H = _GDIPlus_ImageGetHeight ($hSource)
$hClone = _GDIPlus_BitmapCloneArea($hSource,0,0,$W,$H,$GDIP_PXF24RGB)
	For $mat_Y= 0 To $H/$St-1
		For $mat_X= 0 To $W/$St-1
            $RGB = _GDIPlus_BitmapGetPixel($hClone,$mat_X*$St,$mat_Y*$St)
			$hex2='0x'&Hex($RGB,6)
			$sum=$matrix1[$mat_Y][$mat_X]
			GUICtrlSetData($in_sum,$sum)
			If $sum=$hex2 Then $r+=1
		Next
	Next
;----------------------------
_GDIPlus_ImageDispose ($hSource)
_GDIPlus_ImageDispose ($hClone)
_GDIPlus_Shutdown()
;======================================================================
If $r>=5 Then
	GUICtrlSetData($in_result,'Found')
	Sleep(1000)
	ExitLoop
EndIf
WEnd
EndFunc
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Открытие Gdi+ делать один раз, закрывать дескриптор начала поиска файлов, не искать каждый раз файлы. Сделать это один раз и собрать все пути в массив. Уже в нем делать поиск. Уменьшить паузу... Это навскидку
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
snezzok
Код:
;~ GUICtrlSetImage($pic_Result,$path_Result)
 
Автор
snezzok

snezzok

bulatenok_64rus
Сообщения
12
Репутация
0
Спасибо огромное. Поправил и всё стало "самолётом"...
 
Верх