| Message: | Trying to access array offset on value of type null |
| File: | /home/romarekl/public_html/sosyallift.com/ow_plugins/forum/controllers/topic.php |
| Line: | 136 |

Merhaba!
Web uygulaması geliştirme ile ilgili bazı senaryolarda, bir fotoğrafın yüz özelliklerini algılamak gerekebilir. Örneğin, bir resimde kaç kişinin olduğunu tespit eden bir uygulama veya belki de bir fotoğraftaki insanların yüzlerini değiştiren bir uygulama.
Bir mobil uygulama veya bunu yapan bir web uygulaması yapıyor olsanız da, kullanmanın birçok yolu vardır. Yüz Tanıma API gibi 3. taraf API hizmetleri vardır .
Senaryomuzda, görüntülerin bir POST ile yüklenebileceği ve yüzün X ve Y koordinatlarıyla, gözlerin burun ve ağız bölgelerinin bir json yanıtı olarak çizilen veya döndürülen bir arayüz oluşturmak istedik. Bu şekilde, bir mobil ve web uygulaması oluşturmak istiyorsanız, her ikisi de arsa noktalarını merkezi bir şekilde döndürmek için algılama servisini kullanabilir.
PHP Facedetect eklentisini test etmeye karar verdik
Php.ini'nize kurulup aktif hale getirildikten sonra, yüz tanıma fonksiyonlarını kullanmaya başlayabilirsiniz. Temel olarak nasıl çalıştığı, yüzdeki alanları tespit etmek için bir dizi algoritma içeren görüntü yolunu ve beraberindeki bir XML belgesini geçmenizdir (bkz. OpenCV kütüphanesi ).
Yapmak isteyebileceğiniz şey, tespit edilen kitaplıktan birkaç temel şeyi, yani bulunan her yüzün farklı bölümleri de dahil olmak üzere resimde tespit edilen insan sayısını tanımlamak için kullanmaktır.
$total = face_count($path . '/file.jpg',$path . '/haarcascade_frontalface_alt.xml');
$ Toplam değişken bir resimde algılanan insan sayısını temsil eden bir tamsayı içerecektir. Bu numarayı daha sonraki işlemler için temel koşul olarak kullanabilirsiniz veya yok sayabilirsiniz. Sadelik uğruna, fotoğrafta yalnızca bir kişi olduğunu varsayarsak, yüz özelliği tespitini yapabileceğinizi varsayalım:
$face_coord = face_detect($path . '/file.jpg',$path . '/haarcascade_frontalface_alt.xml');
$eye_coord = face_detect($path . '/file.jpg',$path . '/haarcascade_mcs_eyepair_small.xml');
$mouth_coord = face_detect($path . '/file.jpg',$path . '/Mouth.xml');
$nose_coord = face_detect($path . '/file.jpg',$path . '/haarcascade_mcs_nose.xml');
Algılama tamamlandığında, yukarıdaki değişkenlerden biri bir koordinat dizisi içerecektir. Bu yazının en üstündeki resimde, ağız koordinatları bir dizi X & Y ekseni koordinatıyla temsil edilecek, ayrıca W (genişlik) ve H (yükseklik) değişkenleri tespit edilen yüz noktasının içeriğini belirler. Bu gönderinin üstündeki görüntünün spesifik örneğinde, ağızlık alanı aşağıdaki koordinatlarla temsil edilir:
Array ( [0] => Array ( [x] => 213 [y] => 351 [w] => 106 [h] => 64 ) [1] => Array ( [x] => 52 [y] => 375 [w] => 71 [h] => 43 ) [2] => Array ( [x] => 274 [y] => 232 [w] => 98 [h] => 59 ) [3] => Array ( [x] => 230 [y] => 321 [w] => 78 [h] => 47 ) [4] => Array ( [x] => 217 [y] => 9 [w] => 98 [h] => 59 ) [5] => Array ( [x] => 134 [y] => 223 [w] => 129 [h] => 78 ) )
Peki, bu koordinatlarla ne yapıyorsunuz? İlk önce neden bunu yapmak istediğine bağlı! Facebook gibi bir web uygulaması bağlamında, yüz tanıma, yüklenen fotoğrafları etiketlemek amacıyla yüzleri tespit etmek için tasarlanmıştır. Ancak son zamanlardafacebook'un sizin için fotoğraflarınızı otomatik olarak "ön etiketleme" için fotoğraflarda kimlerin olduğunu tespit ettiği yayınlandı . Korkunç değil mi?
Web uygulamanızın, fotoğrafınızı "yaşlandıran" bir uygulama gibi görüntü değişiklikleri yapmasını istiyorsanız, bir görüntüyü dinamik olarak değiştirmek için bu koordinatlarla çalışabilir ve görüntünün ağız, burun, gözler ve yüz bölgelerini ayrı ayrı düzenleyebilirsiniz.
Javascript ve jQuery teknolojisini bu PHP eklentisi ile birleştirerek, söz konusu resimde bazı dinamik dinamik değişiklikler yapabilirsiniz:
// eyes
foreach ($eye_coord as $arr) {
echo "var recteye = document.createElement('div');
document.querySelector('.demo-container').appendChild(recteye);
recteye.classList.add('recteye');
recteye.id = 'recteye';
recteye.style.width = " . $arr['w'] . " + 'px';
recteye.style.height = " . $arr['h'] . " + 'px';
recteye.style.left = (img.offsetLeft + " . $arr['x'] . ") + 'px';
recteye.style.top = (img.offsetTop + " . $arr['y'] . ") + 'px';";
}
Yukarıdaki kod snippet'inde ne yapıyoruz? Eh, hala PHP'deyken, yakın zamanda tespit edilen göz bölgesini özetleyen bir dikdörtgen bölge oluşturmak için CSS stilini eklemek için jQuery kodunu çıkarıyoruz. Başvurulan CSS sınıfları çok basittir, daha sonra X, Y, W, H koordinatları / tamsayıların dinamik olarak oluşturulmuş değişkenleri tarafından şekillendirilen bir sınır ve renk tanımlamaktadır.
Recteye sınıf sadece böyle bir şey olarak tanımlanır:
recteye {
border: 1px solid #a64ceb;
left: -1000px;
position: absolute;
top: -1000px;
z-index:10010;
}
Kod resme karşı çalıştırıldığında, dikdörtgen göz bölgesi üzerinde oluşturulur ve bu gönderinin üstündeki resme benzer bir şeyiniz vardır. Oldukça kolay değil mi?