Что нового

[Автоматизация] Детектирование лиц с помощью Autoit

snezzok

bulatenok_64rus
Сообщения
12
Репутация
0
Привет всем форумчанам, страждущим понять неизведанное!

Принялся я писать программу "Детектор лиц", и когда уже почти настал конец моим стараниям, я с ужасом обнаружил, что моя программа имеет достаточно высокую погрешность в детектировании. Причем эта "погрешность" увеличивается, прямо пропорционально при увеличении расстояния от обьектива камеры до физиономии аборигена.

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

Код исходника ниже:
Код:
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <File.au3>
#include <Array.au3>

Global $path_Find,$sPath,$Hue,$Luminance,$Saturation

$hGUI=GUICreate("WcFd",640,261,-1,1)
GUISetBkColor(0x000000)

$pic=GUICtrlCreatePic('',-321,0,320,240)
$in_sum=GUICtrlCreateInput('',1,241,50,19)
$in_result=GUICtrlCreateInput('',53,241,50,19)
$in_tdiff=GUICtrlCreateInput('',105,241,95,19)
$in_Nf=GUICtrlCreateInput('',203,241,50,19)
$in_Fl=GUICtrlCreateInput('',255,241,140,19)
GUISetState(@SW_SHOW)

$path_Find=FileOpenDialog('',@DesktopDir,'(*.jpg)',1)
$sPath=FileSelectFolder('Detect face',@DesktopDir,1)

Wcfd()

Do
Until GUIGetMsg() = -3

Func Wcfd()
	$hTimer = TimerInit()
	$St=40
;============================================================
_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)
			_WinAPI_ColorRGBToHLS($hex,$Hue,$Luminance,$Saturation)
			$matrix1[$mat_Y][$mat_X]=$Luminance
		Next
	Next
$hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
_GDIPlus_GraphicsDrawImage($hGraphics,$hClone,321,0)
_GDIPlus_ImageDispose ($hSource)
_GDIPlus_ImageDispose ($hClone)
;======================================================================

;======================================================================
$FileList=_FileListToArray($sPath,'*.jpg')
For $Nf= 1 To $FileList[0]
	$r=0
	GUICtrlSetData($in_Fl,$FileList[$Nf])
	GUICtrlSetData($in_Nf,$Nf)
$path_Result = $FileList[$Nf]
$hSource2 =_GDIPlus_ImageLoadFromFile($path_Result)
$W2 = _GDIPlus_ImageGetWidth ($hSource2)
$H2 = _GDIPlus_ImageGetHeight ($hSource2)
	For $mat_Y2= 0 To $H2/$St-1
		For $mat_X2= 0 To $W2/$St-1
			$hClone2 = _GDIPlus_BitmapCloneArea($hSource2,$mat_X2*$St,$mat_Y2*$St,$St,$St,$GDIP_PXF24RGB)
            $RGB2 = _GDIPlus_BitmapGetPixel($hClone2,0,0)
			$hex2='0x'&Hex($RGB2,6)
			_WinAPI_ColorRGBToHLS($hex2,$Hue,$Luminance,$Saturation)
			$sum2=$Luminance-$matrix1[$mat_Y2][$mat_X2]
			If $sum2=0 Then
			$hGraphics2 = _GDIPlus_GraphicsCreateFromHWND($hGUI)
            _GDIPlus_GraphicsDrawImage($hGraphics2,$hClone2,$mat_X2*$St,$mat_Y2*$St)
			EndIf
			GUICtrlSetData($in_sum,$sum2)
			If $sum2=0 Then $r+=1
			GUICtrlSetData($in_result,$r)
		Next
	Next
;----------------------------
$p=5
If $r<$p Then
	GUICtrlSetPos($pic,0,0,320,240)
	GUICtrlSetPos($pic,-321,0,320,240)
EndIf
If $r>=$p Then
GUICtrlSetData($in_result,$r)
$iDiff = TimerDiff($hTimer)
GUICtrlSetData($in_tdiff,Round(Round($iDiff/1000,2)/0.6,2))
ShellExecute($sPath&'\'&$FileList[$Nf])
Sleep(100)
EndIf
Next
_GDIPlus_ImageDispose ($hSource2)
_GDIPlus_ImageDispose ($hClone2)
_GDIPlus_Shutdown()
EndFunc
 

Prog

Продвинутый
Сообщения
593
Репутация
73
Такие задачи обычно решают с помощью OpenCV.
 
Верх