7 Haziran 2016 Salı

Kameradan Yüz Tespiti (OpenCV & C++)

Bu basit projede Visual Studio 2015 ve OpenCV 3.1.0 versiyonunu C++ ile kullandım. Projeyi yabancı bir siteden aldım ve biraz Türkçeleştirerek buraya koydum.

İnternetten indirdiğiniz OpenCV dosyalarını kurulum yayınımda anlattığım gibi C:/ nin altına yerleştirdiyseniz ve adını da OpenCV-3.1.0 yaptıysanız sanıyorum sorun yaşamayacaksınız. Sizdeki durum farklıysa, aşağıdaki kodlarda adres belirttiğim yere kendi OpenCV adresinizi yazmalısınız.

Şimdilik kısaca paylaşıyorum. Daha sonra bu yayına dönüp açıklamalarını da yapmayı düşünüyorum.


#include "stdafx.h"
#include <opencv2\opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
  VideoCapture kamera(0);
  Mat frame, frame_gri;

  CascadeClassifier dedektor;
  bool yuklendi = dedektor.load("C:/OpenCV-3.1.0/build/etc/haarcascades/haarcascade_frontalface_alt.xml");

  // detectMultiscale Cascade Classifier Parametreleri
  int groundThreshold = 2;
  double scaleStep = 1.1;
  Size minimumNesneBoyutu(80, 80);
  Size maksimumNesneBoyutu(250, 250);

  vector<Rect> bulunanlar;

  while(true) {
  kamera >> frame;
  flip(frame, frame, 1);

  cvtColor(frame, frame_gri, CV_BGR2GRAY);

  bulunanlar.clear();

  // Yüzleri algılayalım/bulalım/detect edelim :)
  dedektor.detectMultiScale(frame_gri, bulunanlar, scaleStep, groundThreshold, CV_HAAR_SCALE_IMAGE, minimumNesneBoyutu, maksimumNesneBoyutu);

  if (bulunanlar.size() > 0)
  for (int i = 0; i <= bulunanlar.size() - 1; i++)
                rectangle(frame, bulunanlar[i].br(), bulunanlar[i].tl(), Scalar(0, 0, 0));

        imshow("Yuz Bulucu", frame);

  if (waitKey(20) == 27) break;
  }
  destroyAllWindows();
  return 0;
}

kamera >> frame;
Bu şekildeki kullanımı ilk kez görmüş olabilirsiniz. Burada kamera.read(frame); demiş olduk.

CascadeClassifier dedektor;
  bool yuklendi = dedektor.load("C:/OpenCV-3.1.0/build/etc/haarcascades/haarcascade_frontalface_alt.xml");
haarcascade_frontalface_alt.xml dosyasının içinde, insan yüzlerini bulmaya yarayacak bilgiler mevcut. Bu xml dosyasını load ettiğimizde, dedector adlı CascadeClassifier nesnemiz insan yüzü bulmaya odaklanacaktır. Bu xml dosyasının bulunduğu klasöre bakarsanız, farklı nesnelerin de bulunmasına olanak veren farklı xml dosyaları olduğunu görebilirsiniz.

vector<Rect> bulunanlar;
Bulunan yüzlerimiz bu diziye atanacak.

detectMultiScale(image, objects, scaleFactor, minNeighbors, flags, minSize, maxSize);
Yüz bulma işini yapan komutumuz. Aslında bununla sadece yüz bulma işi yapmıyoruz tabii ki. İlerleyen yayınlarda bunun farklı kullanımlarını da göreceğiz. Şimdi, örneğimizde kullandığımız haliyle parametrelerin ne işe yaradığını görelim:




  • image – CV_8U tipinde görüntü içeren bir matristeki objeleri tespit edeceğiz. (tür: Mat)
  • objects – Tespit edilen objelerin atılacağı dikdörtgenler vektörü dizisi... ( vector<Rect> dediğimiz dizi)
  • scaleFactor – Her resim ölçeğinde görüntü boyutunun ne kadar azalacağı. (Görüntü boyutu bir miktar azaltılmalı ki bu arama işlemimiz hızlı bir şekilde tamamlanabilsin) (tür: double)
  • minNeighbors – Her aday dikdörtgenin kabulü için minimum kaç komşusu olmalı? (Aradığımız objenin tespiti için görüntümüz kare kare incelenir. Bu karelerden bazılarında aradığımız objenin bulunma olasılığı vardır. Eğer bu aday kareler birbirine komşu ise, bu komşu karelerde gerçekten de aradığımız obje vardır diyebiliriz. Bu parametre ile, "En az kaç karenin komşu olması ile o bölgede aradığımız objenin varlığı kabul edilsin?" sorusuna cevap veriyoruz. Bu mevzuyu daha iyi anlamanız için şu videoya bir göz atabilirsiniz: https://vimeo.com/12774628 (tür: int)
  • flags – Henüz ne işe yaradığını bilmiyorum. Bilen bana da söylesin. Sıfır da verseniz oluyor. :) (tür: int)
  • minSize – Aradığımız objenin min. boyutları. Bu boyutlardan küçük olanlar ilgisiz kabul edilir. (tür: Size)
  • maxSize – Aradığımız objenin maks. boyutları. Bu boyutlardan büyük olanlar ilgisiz kabul edilir. (tür: Size)


  • Bu konuda pek Türkçe kaynak yoktu. Artık var... :) 
    Sonraki yayında görüşmek üzere...





    << AnaSayfa - << Önceki Yayın - Sonraki Yayın >>

    Hiç yorum yok:

    Yorum Gönder