Entry tags:
Идентификация глаз.
Просто внезапно подумалось - если взять фотографию человека, поставить точно посередине глаза точку и "развернуть" это фото относительно этой точки, то окружность станет прямоугольником, значит зрачек станет тоже черным прямоугольником. Это в идеале. На практике, конечно будет блик, скорей всего круглый. Поэтому, этот блик тоже можно "развернуть" и идентифицировать таким же образом. На этом приницпе, теоретически, можно сделать идентификацию круглых частей на фото. А пара таких частей - это глаза, значит и идентификацию лиц сделать можно.
Естественно, все это делать я не собирался, но мне стало интересно проверить эту гипотезу, поэтому я набросал шейдер для pixel bender-а.

Как видно из этой картинки, я не ошибся. Однако и прав я был лишь частично. Неможно поигравшись с шейдером и разными картинками, я понял, что реальный зрачек далеко не всегда черный, и далеко не всегда круглый. Кроме того, алгорим хорошо работает на зрачках, сфотографированных крупным планом, а в реальной жизни так не бывает.
Исходник шейдера:
<languageVersion: 1.0;>
kernel Pixelate
< namespace: "";
vendor: "chabapok";
version : 2;
description : "identify glaz test"; >
{
parameter float x0 <minValue: 000.0; maxValue: 700.0; defaultValue:591.0;>;
parameter float y0 <minValue: 0.0; maxValue: 700.0; defaultValue:318.0;>;
parameter float sx<minValue: 0.0; maxValue:1.0;defaultValue:0.34;>;
parameter float sy<minValue: 0.0; maxValue:2.0;defaultValue:1.25;>;
input image4 inputImage;
output pixel4 outputPixel;
void
evaluatePixel()
{
float2 dst = outCoord();
float pi = 3.14159265358979;
float2 sc = float2(
x0+dst[1]*sy*cos(dst[0]*2.0*pi*sx/360.0),
y0-dst[1]*sy*sin(dst[0]*2.0*pi*sx/360.0) );
outputPixel = sampleNearest(inputImage, sc);
}
}
Естественно, все это делать я не собирался, но мне стало интересно проверить эту гипотезу, поэтому я набросал шейдер для pixel bender-а.

Как видно из этой картинки, я не ошибся. Однако и прав я был лишь частично. Неможно поигравшись с шейдером и разными картинками, я понял, что реальный зрачек далеко не всегда черный, и далеко не всегда круглый. Кроме того, алгорим хорошо работает на зрачках, сфотографированных крупным планом, а в реальной жизни так не бывает.
Исходник шейдера:
<languageVersion: 1.0;>
kernel Pixelate
< namespace: "";
vendor: "chabapok";
version : 2;
description : "identify glaz test"; >
{
parameter float x0 <minValue: 000.0; maxValue: 700.0; defaultValue:591.0;>;
parameter float y0 <minValue: 0.0; maxValue: 700.0; defaultValue:318.0;>;
parameter float sx<minValue: 0.0; maxValue:1.0;defaultValue:0.34;>;
parameter float sy<minValue: 0.0; maxValue:2.0;defaultValue:1.25;>;
input image4 inputImage;
output pixel4 outputPixel;
void
evaluatePixel()
{
float2 dst = outCoord();
float pi = 3.14159265358979;
float2 sc = float2(
x0+dst[1]*sy*cos(dst[0]*2.0*pi*sx/360.0),
y0-dst[1]*sy*sin(dst[0]*2.0*pi*sx/360.0) );
outputPixel = sampleNearest(inputImage, sc);
}
}