dlib: ΠΏΡΠ°ΠΊΡΠΈΠΊΡΠΌ
ΠΡΠΏΡΡΠΊ 2
ΠΡΠ° ΡΡΠ°ΡΡΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΡΡΡΡ ΡΠΈΠΊΠ»Π°, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΡ ΠΎΠ΄ΠΈΠ» Π² Β«FPSΒ» Π² 2017 Π³ΠΎΠ΄Ρ. ΠΠ°Π΄Π΅Π΅ΠΌΡΡ, ΡΡΠΎ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ°Ρ ΡΠ°ΡΡΡ ΡΠΈΠΊΠ»Π° ΡΠΊΠΎΡΠΎ ΡΠΎΠΆΠ΅ Π±ΡΠ΄ΡΡ Π΄ΠΎΡΡΡΠΏΠ½Π° ΠΎΠ½Π»Π°ΠΉΠ½.
ΠΠ΄ΠΈΠ½ ΠΈΠ· ΡΠ°ΠΌΡΡ Π²ΠΎΡΡΡΠ΅Π±ΠΎΠ²Π°Π½Π½ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² dlib β ΡΡΠΎ dlib.image, ΠΏΠ°ΠΊΠ΅Ρ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡΠΌΠΈ. ΠΠ½ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΡ ΡΠΈΠ»ΡΡΡΠΎΠ², Π²ΠΊΠ»ΡΡΠ°Ρ ΡΠ²Π΅ΡΡΠΊΡ ΡΠ΄ΡΠΎΠΌ 3x3. ΠΠΎ Π΅ΡΠ»ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΎΠΊΠΎΠ½Π½ΡΠΉ ΡΠΈΠ»ΡΡΡ, ΡΠΎ ΠΏΡΠΈΠ΄Π΅ΡΡΡ Π²Π²ΠΎΠ΄ΠΈΡΡ ΠΌΠ½ΠΎΠ³ΠΎ boilerplate-ΠΊΠΎΠ΄Π°, ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠ³ΠΎ Ρ ΡΠ°ΡΡΡΠ΅ΡΠΎΠΌ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°Ρ ΠΏΠΈΠΊΡΠ΅Π»Π΅ΠΉ, ΡΡΠΎ Π½Π΅ ΠΎΡΠ΅Π½Ρ ΡΠ»Π΅Π³Π°Π½ΡΠ½ΠΎ. ΠΠ° ΠΏΠΎΠΌΠΎΡΡ ΠΏΡΠΈΡ ΠΎΠ΄ΡΡ Π΄Π²ΡΠΌΠ΅ΡΠ½ΡΠ΅ ΠΎΠΊΠΎΠ½Π½ΡΠ΅ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΊΠΎΡΠΎΡΡΡ ΠΏΠΎΡΠ²ΠΈΠ»Π°ΡΡ Π² dlib 0.9.
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΡ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎ. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΡΠΎΠΉ ΠΆΠ΅ ΡΠ²Π΅ΡΡΠΊΠΈ:
float[3][3] kernel = [
[1, 1, 1],
[1, 1, 1],
[1, 1, 1],
];
Π’Π΅ΠΏΠ΅ΡΡ, Π΅ΡΠ»ΠΈ Ρ Π²Π°Ρ Π΅ΡΡΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ img, ΡΠΎ Π΄Π»Ρ ΠΏΡΠΎΡ ΠΎΠ΄Π° ΠΎΠΊΠ½ΠΎΠΌ ΠΏΠΎ Π²ΡΠ΅ΠΌΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ windows ΠΈ foreach Ρ ΡΡΠ΅ΠΌΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ β window (ΡΡΡΡΠΊΡΡΡΠ°, Ρ ΡΠ°Π½ΡΡΠ°Ρ ΡΠ΅ΠΊΡΡΠΈΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΏΠΈΠΊΡΠ΅Π»Π΅ΠΉ Π² ΠΎΠΊΠ½Π΅), x ΠΈ y (ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ ΠΎΠΊΠ½Π°):
foreach(window, x, y; img.windows(3, 3))
{
// ...
}
ΠΠ½ΡΡΡΠΈ ΡΡΠΎΠ³ΠΎ ΡΠΈΠΊΠ»Π° ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΅ΠΌ ΠΆΠ΅ ΠΌΠ°Π½Π΅ΡΠΎΠΌ ΠΏΠ΅ΡΠ΅Π±ΡΠ°ΡΡ Π²ΡΠ΅ ΠΏΠΈΠΊΡΠ΅Π»ΠΈ Π² ΠΎΠΊΠ½Π΅ ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ½ΠΎΠΆΠΈΡΡ ΠΈΡ Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ ΡΠ΄ΡΠ° kernel:
Color4f sum = Color4f(0, 0, 0);
foreach(ref Color4f pixel, x, y; window)
sum += pixel * kernel[y][x];
ΠΡΡΠΈΡΠ»ΡΠ΅ΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΡΠ²Π΅ΡΡΠΊΠΈ ΠΈ ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌ Π² Π΄ΡΡΠ³ΠΎΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅:
outputImage[x, y] = sum / 9.0f;