Simple Eye, Nose and Mouth Detection using OpenCV | Visual Studio

Setelah tadi kita membuat projek Simple Face Detection using OpenCV. Sekarang kita akan mencoba membuat projek Simple Eye, Nose and Mouth Detection using OpenCV | Visual Studio. Sebenarnya kodingan masih sama seperti projek tadi, kita tinggal mengganti pembacaan file XML-nya aja dengan memodifikasi sedikit kodingan.

Berikut tahapan-tahapannya :
1. Bagi kamu yang belum install OpenCV, ikutin step by step di postingan install OpenCV dengan Visual Studio disini. Saya sarankan menggunakan OpenCV 2.1.0 karena saya menggunakan yang itu. (Biar sama :p)

2. Setelah selesai meng-install dan setting Project Directories kamu tinggal copy-paste kodingan di bawah :


#include "stdafx.h"
#include "cv.h"
#include "highgui.h"

void detect_and_draw(IplImage* img)
{
        //inisialisasi
        CvHaarClassifierCascade *cascade=0;
        CvHaarClassifierCascade *cascade1=0;
CvHaarClassifierCascade *cascade2=0;
        CvMemStorage *storage=0;

        IplImage* gray = img;

        //baca file xml untuk image detection
        if(!cascade)
        {
//untuk deteksi hidung
                char * file = "C:/OpenCV2.1/data/haarcascades/haarcascade_mcs_nose.xml";
//untuk deteksi mata
                char * file1 = "C:/OpenCV2.1/data/haarcascades/haarcascade_eye.xml";
//untuk deteksi mulut
char * file2 = "C:/OpenCV2.1/data/haarcascades/haarcascade_mcs_mouth.xml";

                cascade = (CvHaarClassifierCascade*) cvLoad(file,0,0,0);
                cascade1 = (CvHaarClassifierCascade*) cvLoad(file1,0,0,0);
cascade2 = (CvHaarClassifierCascade*) cvLoad(file2,0,0,0);
                storage = cvCreateMemStorage(0);
        }

        //mendeteksi image hidung
        CvSeq* noses =
                cvHaarDetectObjects(
                gray,
                cascade,
                storage,
                1.1,
                3,
                CV_HAAR_DO_CANNY_PRUNING,
                cvSize(10,10));

        //mendeteksi image mata
        CvSeq* eyes =
                cvHaarDetectObjects(
                gray,
                cascade1,
                storage,
                1.1,
                3,
                CV_HAAR_DO_CANNY_PRUNING,
                cvSize(20,20));

        //mendeteksi image mulut
        CvSeq* mouth =
                cvHaarDetectObjects(
                gray,
                cascade2,
                storage,
                1.1,
                3,
                CV_HAAR_DO_CANNY_PRUNING,
                cvSize(10,10));

        int i;

        //menggambar kotak merah pada bagian hidung yang ditemukan
        for(i = 0; i < (noses ? noses->total : 0); i++)
        {
                CvRect* r = (CvRect*) cvGetSeqElem(noses, i);
                cvRectangle(
                        img,
                        cvPoint(r->x, r->y),
                        cvPoint(r->x + r->width, r->y + r->height),
                        CV_RGB(255,0,0),
                        1, 20, 0
                );
        }

        //menggambar kotak biru laut pada bagian mata yang ditemukan
        for(i = 0; i < (eyes ? eyes->total : 0); i++)
        {
                CvRect* r = (CvRect*) cvGetSeqElem(eyes, i);
                cvRectangle(
                        img,
                        cvPoint(r->x, r->y),
                        cvPoint(r->x + r->width, r->y + r->height),
                        CV_RGB(0,255,255),
                        1, 20, 0
                );
        }

//menggambar kotak putih pada bagian mulut yang ditemukan
        for(i = 0; i < (mouth ? mouth->total : 0); i++)
        {
                CvRect* r = (CvRect*) cvGetSeqElem(mouth, i);
                cvRectangle(
                        img,
                        cvPoint(r->x, r->y),
                        cvPoint(r->x + r->width, r->y + r->height),
                        CV_RGB(255,255,255),
                        1, 20, 0
                );
        }

        //menampilkan gambar hasil deteksi
        cvNamedWindow("hasil");
        cvShowImage("hasil", img);

        cvWaitKey(0);
}

int main(array<System::String ^> ^args)
{
    //load image asli
        const char* filename = "dank3.jpg";
        IplImage* img = cvLoadImage(filename);

        //pemanggilan fungsi untuk deteksi wajah
        detect_and_draw(img);
}


3. Untuk yang berwarna merah sesuaikan dengan nama file foto yang sudah kalian masukkan di dalam projeknya. Kalau saya file fotonya ada di C:\Users\Ozi Priawadi\Documents\Visual Studio 2012\Projects\FaceDetection\FaceDetection\dank3.jpg. Kalau yang berwarna biru sesuaikan dengan folder instalan OpenCV yang sudah kamu buat.

4. Setelah selesai coba klik RUN projeknya dan hasilnya kira-kira seperti ini