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