Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 94 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
94
Dung lượng
2,28 MB
Nội dung
TRƯỜNG ĐẠI HỌC GIAO THƠNG VẬN TẢI TP HỒ CHÍ MINH KHOA ĐIỆN – ĐIỆN TỬ VIỄN THÔNG LUẬN VĂN TỐT NGHIỆP NHẬN DIỆN TRẠNG THÁI CỦA MẮT VÀ ỨNG DỤNG VÀO HỆ THỐNG PHÁT HIỆNCẢNH BÁO NGỦ GẬT CHO TÀI XẾ Ngành: KỸ THUẬT ĐIỆN TỬ VÀ TRUYỀN THÔNG Chuyên ngành: ĐIỆN TỬ VIỄN THÔNG Giảng viên hướng dẫn : Ths Phan Thanh Minh Sinh viên thực Lê Viết Tri : MSSV : 0951040071 - Lớp: DV09 Võ Kim Hưng MSSV : 0951040031 - Lớp: DV09 TP Hồ Chí Minh, 2013 LỜI CẢM ƠN Sau thời gian dài học tập nghiên cứu, cuối chúng tơi hồn thành khóa luận tốt nghiệp này, dịp tốt để gửi lời cảm ơn đến tất người Trước tiên xin chân thành cảm ơn Ban Giám Hiệu tồn thể q thầy trường Đại học Giao Thông Vận Tải TP.HCM Và đặc biệt quý thầy cô Khoa Điện-Điện tử viễn thơng tận tình giảng dạy trang bị cho kiến thức quý giá suốt năm học vừa qua chuyên ngành điện tử viễn thơng , giúp cho chúng tơi có tảng kiến thức vững để thực khóa luận nghiên cứu học tập sau Bên cạnh chúng tơi xin gửi lời cảm ơn đến thầy giáo Ths Phan Thanh Minh Thầy tận tình hướng dẫn chúng tơi từ lúc nhận đề tài lúc hoàn thành tốt đề tài tốt nghiệp ngày hôm Cuối cùng, xin gửi lời cảm ơn đến tất bạn bè, anh, chị, người giúp đỡ, khích lệ phê bình, góp ý, giúp chúng tơi hồn thành khóa luận cách tốt TP.HCM , tháng năm 2013 Trang i MỤC LỤC Lời mở đầu : Error! Bookmark not defined Chương I : Giới thiệu 1.1 Tổng quan việc phát theo dõi hình ảnh 1.2 Nền tảng : Chương II : Cơ sở lý thuyết 2.1 Tổng quan 2.2 Khái niệm chung 2.2.1 Machine learning 2.2.2 Computer vision 2.2.3 Opencv 2.3 Face detection 2.3.1 Tổng quan 2.3.2 Một số phương pháp cụ thể hướng tiếp cận dựa diện mạo 10 2.3.3 Đặc trưng Haar-like 16 2.3.4 Thuật toán Adaboost 20 2.3.4.1 Tiếp cận Boosting 20 2.3.4.2 Adaboost 22 2.3.5 Cascade of Classifiers 23 2.3.6 Thuật toán Camshift 25 2.3.6.1 Biểu đồ 25 2.3.6.2 Thuật toán Camshift 26 2.3.6.3 Mean Shift 27 2.4 Eye detection 29 2.4.1 Structure of human eye 29 2.4.2 Color space 30 2.4.2.1 Mơ hình màu RGB 30 Trang ii 2.4.2.2 Mơ hình màu HSV 31 2.4.2.3 Gray color space 32 2.4.2.4 XYZ color space 33 2.4.3 Threshold 33 2.4.3.1 Global thresholding 34 2.4.3.2 Adaptive thresholding 34 2.4.4 Canny edge 36 2.4.4.1 Giới thiệu 36 2.4.4.2 Thuật toán phát biên Canny 36 2.4.5 Hough circle transform 42 Chương III : Thuật toán thực thuật toán 46 3.1 Thuật tốn chương trình : 46 3.2 Chương trình phát : 48 3.3 Chương trình cảnh báo : 51 3.3.1 Chức ‘count sleep’ : 51 3.3.2 Chương trình cảnh báo : 52 Chương IV : Kết đánh giá 54 4.1 Thử nghiệm kết 54 4.2 Phân tích thảo luận : 58 4.2.1 Kết phân tích : 58 4.2.2 Thảo luận : 59 Chương V : Kết luận hướng phát triển đề tài .60 5.1 Kết luận 60 5.2 Hạn chế 60 5.3 Hướng phát triển đề tài 61 Tài liệu tham khảo 62 Phụ lục : PROGRAM CODE 63 Trang iii DANH SÁCH CÁC TỪ VIẾT TẮT DÙNG TRONG LUẬN VĂN Từ viết tắt Camshift Giải thích Continously Adaptive Mean Shift Algorithm HCT Hough Circle Transform HMM Hidden Markov Model HSV Hue – Saturation - Value ROI Region Of Interest RGB Red – Green - Blue SVM Support Vector Machine Trang iv DANH MỤC CÁC HÌNH TRONG LUẬN VĂN Trang Hình 2.2: Cấu trúc OpenCV Hình 2.3.2a: Các vector quan sát để huấn luyện cho HMM 11 Hình 2.3.2b: Các trạng thái ẩn 12 Hình 2.3.2c: Xác định khn mặt HMM 13 Hình 2.3.3a: đặt trưng Haar-like 14 Hình 2.3.3b: Các đặc trưng mở rộng đặc trưng Haar-like sở 15 Hình 2.3.3c: Cách tính Integral Image ảnh 16 Hình 2.3.3d: Ví dụ cách tính nhanh giá trị mức xám vùng D ảnh 17 Hình 2.3.3e: Hình dung cửa sổ chứa đặc trưng Haar-like 19 Hình 2.3.4a: Boosting 21 Hình 2.3.5a: Cascade of classifiers 22 Hình 2.3.5b: Tồng quan phát mặt người 23 Hình 2.3.6a: Biểu đồ RGB hình ảnh 26 Hình 2.4.1a: Cấu trúc mắt người 27 Hình 2.4.2a : RGB color space 29 Hình 2.4.2b: HSV mơ hình màu lục giác hình nón 31 Hình 2.4.2c: Lena Image in Color and gray scale version 32 Hình 2.4.3a: Thuật tốn để tính tốn ngưỡng thích nghi 35 Hình 2.4.3b: Ví dụ ngưỡng thích nghi hình ảnh 35 Trang v Hình 2.4.4a: Ví dụ phát biên Canny 36 Hình 2.4.4b: Hình ảnh làm mịn 37 Hình 2.4.4c: Độ lớn gradient hình ảnh trơn 37 Hình 2.4.4d: Mơ tả loại bỏ thành phần không tối đa 38 Hình 2.4.4e: Loại bỏ thành phần không tối đa 39 Hình 2.4.4f: Tạo ngưỡng cạnh 40 Hình 2.4.4g: Theo dõi cạnh kết cuối 41 Hình 2.4.5a : Đường trịn với bán kính R cho trước 43 Hình 2.4.5b : Nhiều đường trịn với bán kính R cho trước 44 Hình 3.1a : Thuật tốn chương trình 46 Hình 3.2a : Sơ đồ chương trình phát mắt 48 Hình 3.2b : Phân chia vùng mắt 49 Hình 3.2c : a) ảnh RGB b) thành phần Z mã màu XYZ 50 Hình 3.2d : Ảnh ngõ vào tạo ảnh nhị phân từ ảnh Z 50 Hình 3.2e : Ảnh làm mịn 51 Hình 3.3.1 : Sơ đồ đếm số khung phát 52 Hình 3.3.2: Sơ đồ chương trình cảnh báo 53 Trang vi Luận văn tốt nghiệp GVHD : Ths Phan Thanh Minh LỜI MỞ ĐẦU - Lái xe mệt mỏi, ngủ gật nguyên nhân số lượng lớn vụ tai nạn xe - Lý để buồn ngủ ập đến bạn lái ô tô hay xe máy đa dạng tùy người điều kiện thời điểm Có nhiều người ngủ gật trời nắng khiến mắt nheo lại tạo buồn ngủ, nhiều người lại khơng thể đeo kính râm cảm giác mát mẻ khiến buồn ngủ ập tới - Nhiều người buồn ngủ trời dịu mát hay bật điều hòa xe hơi, nhiều người lại buồn ngủ cảm giác nóng nực nắng - Ngoài nguyên nhân khách quan trên, nhiều nguyên nhân khác khiến người lái xe ngủ gật, thiếu ngủ vào ngày hôm trước, sử dụng rượu bia, sử dụng thuốc cảm cúm gây buồn ngủ, lái xe liên tục… - Nguyên nhân nhiều, kết thúc thường vụ tai nạn ngủ gật khả điều khiển ô tô hay xe máy, dẫn tới va chạm với xe khác tự ngã đường - Thống kê gần ước tính hàng năm 36.376 trường hợp, giết chết 9.838 người, bị thương 38.060 người tai nạn liên quan đến mệt mỏi (Theo Baomoi.com-dự toán vụ tai nạn xe Việt Nam năm 2012) - Sự phát triển công nghệ để phát ngăn chặn buồn ngủ lái xe thách thức lớn lĩnh vực phát triển hệ thống tránh tai nạn Vì nguy hiểm mà việc buồn ngủ tham gia giao thơng, phương pháp phịng tránh cần phải phát triển để chống lại ảnh hưởng - Bằng cách giám sát mắt, chúng tơi tin biểu lái xe mệt mỏi phát sớm, đủ để tránh tai nạn xe Phát ngủ gật liên quan đến việc quan sát chuyển động mắt mơ hình nhấp nháy chuỗi hình ảnh khuôn mặt Trang Luận văn tốt nghiệp GVHD : Ths Phan Thanh Minh - Mục đích luận văn phát triển hệ thống phát buồn ngủ Trọng tâm đặt thiết kế hệ thống mà theo dõi xác tình trạng mở đóng cửa đôi mắt người lái xe thời gian thực - Chương trình phát hiện, theo dõi cảnh báo ngủ gật cho tài xế lái xe phát triển dựa mã nguồn mở OpenCV thông qua Microsoft Visual Studio 2008 Yêu cầu phát theo dõi mắt người thông qua webcam máy tính, cảnh báo tài xế ngủ gật tương ứng với việc không phát khoảng thời gian định đưa mức cảnh báo( âm tăng dần), cảnh báo tắt tài xế mở mắt trở lại Với mục tiêu tìm hiểu giải thuật adaboost, đặc trưng haar-like, mơ hình Cascade of Classifiers, đồng thời áp dụng vào toán phát mặt người đồng thời nhận dạng trạng thái mắt từ camera, luân văn trình bày chương với bố cục sau : - Chương I giới thiệu vấn đề thực tế phần luận - Chương II sở lý thuyết cần thiết cho luận, bao gồm việc giới thiệu mã nguồn mở OpenCV chuyên dụng cho việc xử lý ảnh, thuật tốn phát khn mặt, mắt, phương pháp phát cạnh( biên) , không gian màu… - Chương III đưa lưu đồ xây dựng chương trình chương trình ( lưu đồ phát mặt, phát ngươi, điều kiện cảnh báo, chương trình cảnh báo) - Các kết thực nghiệm đưa chương IV để đánh giá xác suất thành công chương trình, chương V nêu ưu khuyết điểm chương trình, ứng dụng thực tế Đề tài nhằm mô tả cho biết làm để phát dược khuôn mặt , làm để phát mắt, làm để xác định mắt mở Trang Luận văn tốt nghiệp GVHD : Ths Phan Thanh Minh nhắm lại Nền tảng đề tài bao gồm việc phát trạng thái buồn ngủ tập trung tài xế đưa cảnh báo , đề tài khơng có khả đánh giá mức độ buồn ngủ , mệt mỏi tập trung nhiều hay Hy vọng tương lai hệ thống nhà sản xuất ô tô , xe tải , xe khách …tích hợp vào hệ thống điều khiển xe để giúp cho việc lái xe trở nên an toàn giảm thiểu tai nạn đáng tiếc mệt mỏi , tập trung tài xế gây Trong trình thực đề tài chúng tơi cịn nhiều bỡ ngỡ, chưa có kinh nghiệm thực tiễn nên không tránh khỏi sai sót Vì vậy, chúng tơi mong nhận góp ý thầy, giáo để ngày hoàn thiện Trang Luận văn tốt nghiệp GVHD : Ths Phan Thanh Minh } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// FUNCTION ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void detectpupil(IplImage* eye,double *count_detect,int facerect_x,int facerect_y,CvRect* r,float n ) { cvCreateTrackbar( "Threshold_2", "DisplayWindow", &Threshold_2, 255, ); IplImage* eyeRegion = cvCreateImage(cvGetSize(eye),8,3); cvSetImageROI(eye, cvRect(eye->width/10,eye->height/3,eye->width*7/10,eye>height/2.5)); eyeRegion = cvCloneImage(eye); CvSize size = cvGetSize(eyeRegion); IplImage * XYZ_frame IplImage * frame = cvCreateImage(size, IPL_DEPTH_8U, 1); = cvCreateImage(size, IPL_DEPTH_8U, 3); IplImage* thresholded = cvCreateImage(size, IPL_DEPTH_8U, 1); cvCopy(eyeRegion,frame,0); cvCvtColor(frame, XYZ_frame, CV_BGR2GRAY); // cvShowImage("1", XYZ_frame); cvEqualizeHist(XYZ_frame,XYZ_frame); cvThreshold(XYZ_frame, thresholded, Threshold_1 ,256, CV_THRESH_TRUNC); cvEqualizeHist(thresholded,thresholded); Trang 73 Luận văn tốt nghiệp // GVHD : Ths Phan Thanh Minh cvShowImage("2", thresholded); { cvSetImageROI(thresholded, cvRect(0,0,cvRound(thresholded- >width/5),cvRound(thresholded->height/5))); cvThreshold(thresholded, thresholded, 25,256, CV_THRESH_BINARY_INV); cvResetImageROI(thresholded); cvSetImageROI(thresholded, cvRect(cvRound(thresholded>width/5)+1,0,cvRound(thresholded->width*23/35),cvRound(thresholded>height/5))); cvThreshold(thresholded, thresholded, 25 ,256, CV_THRESH_BINARY_INV); cvResetImageROI(thresholded); cvSetImageROI(thresholded, cvRect(cvRound(thresholded>width*6/7)+1,0,cvRound(thresholded->width/5),cvRound(thresholded>height/5))); cvThreshold(thresholded, thresholded, 25 ,256, CV_THRESH_BINARY_INV); cvResetImageROI(thresholded); cvSetImageROI(thresholded, cvRect(0,cvRound(thresholded>height/5)+1,cvRound(thresholded->width/5),cvRound(thresholded->height*3/5))); cvThreshold(thresholded, thresholded, 10 ,256, CV_THRESH_BINARY_INV); cvResetImageROI(thresholded); cvSetImageROI(thresholded, cvRect(cvRound(thresholded>width*6/7)+1,cvRound(thresholded->height/5)+1,cvRound(thresholded>width/5),cvRound(thresholded->height*3/5))); cvThreshold(thresholded, thresholded, 10 ,256, CV_THRESH_BINARY_INV); Trang 74 Luận văn tốt nghiệp GVHD : Ths Phan Thanh Minh cvResetImageROI(thresholded); cvSetImageROI(thresholded, cvRect(0,cvRound(thresholded>height*4/5)+1,cvRound(thresholded->width/5),cvRound(thresholded->height/5))); cvThreshold(thresholded, thresholded, 10 ,256, CV_THRESH_BINARY_INV); cvResetImageROI(thresholded); cvSetImageROI(thresholded, cvRect(cvRound(thresholded>width/5)+1,cvRound(thresholded->height*4/5)+1,cvRound(thresholded>width*23/35),cvRound(thresholded->height/5))); cvThreshold(thresholded, thresholded, 25 ,256, CV_THRESH_BINARY_INV); cvResetImageROI(thresholded); cvSetImageROI(thresholded, cvRect(cvRound(thresholded>width*6/7)+1,cvRound(thresholded->height*4/5)+1,cvRound(thresholded>width/5),cvRound(thresholded->height/5))); cvThreshold(thresholded, thresholded, 30 ,256, CV_THRESH_BINARY_INV); cvResetImageROI(thresholded); cvSetImageROI(thresholded, cvRect(cvRound(thresholded>width/5)+1,cvRound(thresholded->height/5)+1,cvRound(thresholded>width*23/35),cvRound(thresholded->height*3/5))); cvThreshold(thresholded, thresholded, Threshold_2 ,256, CV_THRESH_BINARY_INV); cvResetImageROI(thresholded); } cvSmooth( thresholded,thresholded,CV_MEDIAN,9); cvSmooth( thresholded,thresholded,CV_GAUSSIAN, 3,0 ,5,5 ); cvMorphologyEx(thresholded, thresholded,0,0,CV_MOP_OPEN,1); Trang 75 Luận văn tốt nghiệp // GVHD : Ths Phan Thanh Minh cvShowImage("4", thresholded); // Resise THreshold image IplImage* thresholded_resize = cvCreateImage(cvSize((int)(eye- >width*n),(int)(eye->height*n)), IPL_DEPTH_8U, 1); cvResize(thresholded,thresholded_resize,0); cvMorphologyEx(thresholded, thresholded,0,0,CV_MOP_GRADIENT,1); cvMorphologyEx(thresholded_resize, thresholded_resize,0,0,CV_MOP_CLOSE,1); cvMorphologyEx(thresholded_resize, thresholded_resize,0,0,CV_MOP_OPEN,1); //Pyramid scaling to reduce noise //cvShowImage("5", thresholded_resize); IplImage* thresholded_resize_downscale = cvCreateImage(cvSize((int)(eye>width*n/2),(int)(eye->height*n/2)), IPL_DEPTH_8U, 1); cvPyrDown(thresholded_resize,thresholded_resize_downscale,CV_GAUSSIAN_5x 5); cvPyrUp(thresholded_resize_downscale,thresholded_resize,CV_GAUSSIAN_5x5); // cvShowImage("6", thresholded_resize); //Dilate & Erode to reduce noise IplConvKernel* kernel = cvCreateStructuringElementEx(3,3,0,0, CV_SHAPE_RECT); cvErode(thresholded_resize,thresholded_resize,kernel,1); cvDilate(thresholded_resize,thresholded_resize,kernel,1); // cvShowImage("7", thresholded_resize); cvSmooth( thresholded,thresholded,CV_MEDIAN,11); cvSmooth( thresholded,thresholded,CV_GAUSSIAN, 3,0 ,2,2 ); cvShowImage("thresholded_resize", thresholded_resize); //Draw Circle Pupil CvMemStorage* storage = cvCreateMemStorage(0); Trang 76 Luận văn tốt nghiệp GVHD : Ths Phan Thanh Minh CvSeq* circles = cvHoughCircles(thresholded_resize, storage, CV_HOUGH_GRADIENT, 2,thresholded_resize->height/4, 80,40, 3, 40); if (circles) { for (int i = 0; circles->total>=1 ? (itotal) ; i++) { float* p = (float*)cvGetSeqElem( circles, i ); p[0] = (float)r->height/2*n; p[1] = (float)r->width/2*n; double x= sqrt((double)(r->height)*(double)(r->height)+(double)(r>width)*(double)(r->width)); if (p[2]>x/15 && p[2]x + cvRound(p[0])/n),(int)(facerect_y+r->y + cvRound(p[1])/n*1.3)), cvRound(p[2]/n), CV_RGB(255,0,0), 2, 8, ); } } } cvResetImageROI(eye); cvReleaseImage( &eyeRegion); cvReleaseImage( &XYZ_frame ); Trang 77 Luận văn tốt nghiệp GVHD : Ths Phan Thanh Minh cvReleaseImage( &frame ); cvReleaseImage( &thresholded ); cvReleaseImage( &thresholded_resize ); cvReleaseImage( &thresholded_resize_downscale); cvResetImageROI(eye); cvReleaseMemStorage(&storage); } void alertsleep(double *count_frame, double *count_detect) { double text_delay1=30; CvFont font; cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 2, 0.4, 0, 3, 8); int is_blink = counter_blink(count_frame, count_detect ,&count_blink, &count_blink_previous2); int is_blink_sleep = counter_sleep(count_frame, count_detect ,&count_blink_sleep, &count_blink_previous1); if (is_blink_sleep) { count_sleep++; warning_I=1; if(count_sleep==1) count_frame_sleep = *count_frame; if(*count_frame-count_frame_sleep==15) warning_II=1; else if(*count_frame-count_frame_sleep==30) warning_III=1; else if(*count_frame-count_frame_sleep>=30) count_frame_sleep=*count_frame; //warning if (warning_III==1) { Trang 78 Luận văn tốt nghiệp GVHD : Ths Phan Thanh Minh PlaySound(TEXT("alarmI.wav"),NULL,0x20000|1|1); //(,NULL,SND_FILENAME 0x20000,SND_LOOP 1,SND_ASYNC 1) printf("\n canh bao muc \n"); } else { if (warning_II==1) { PlaySound(TEXT("alarmII.wav"),NULL,0x20000|1|1); //(,NULL,SND_FILENAME 0x20000,SND_LOOP 1,SND_ASYNC 1) printf("\n canh bao muc \n"); } else { if (warning_I==1) { PlaySound(TEXT("alarmIII.wav"),NULL,0x20000|1|1); //(,NULL,SND_FILENAME 0x20000,SND_LOOP 1,SND_ASYNC 1) printf("\n canh bao muc \n"); } } } }//end if (is_blink_sleep) if(!is_blink) { warning_I=0; warning_II=0; warning_III=0; Trang 79 Luận văn tốt nghiệp GVHD : Ths Phan Thanh Minh } } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// int counter_sleep(double *count_frame, double *count_detect,double *count_blink_sleep,double *count_blink_previous1) { int is_blink_sleep=0; if (*count_frame==*count_blink_sleep) { *count_blink_sleep+=15; if (*count_detect < *count_blink_previous1+5) { is_blink_sleep = 1; printf (" \n ngu gat \n"); } else is_blink_sleep = 0; if (is_blink_sleep==0) *count_blink_previous1 = *count_detect; } return is_blink_sleep; } int counter_blink(double *count_frame, double *count_detect,double *count_blink,double *count_blink_previous2) { int is_blink=0; if (*count_frame==*count_blink) { *count_blink+=1; if (*count_detect < *count_blink_previous2+1) Trang 80 Luận văn tốt nghiệp GVHD : Ths Phan Thanh Minh { is_blink = 1; printf ( " Khong phat hien duoc mat "); } else is_blink = 0; *count_blink_previous2 = *count_detect; } return is_blink; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // initAll() // void initAll() { pCapture = cvCaptureFromCAM(0); initFaceDet("haarcascade_frontalface_default.xml"); } void captureVideoFrame() { // Capture the next frame IplImage * pVideoFrame = nextVideoFrame(); // Copy it to the display image, inverting it if needed if( !pVideoFrameCopy ) pVideoFrameCopy = cvCreateImage( cvGetSize(pVideoFrame), 8, ); cvCopy( pVideoFrame, pVideoFrameCopy, ); pVideoFrameCopy->origin = pVideoFrame->origin; if( == pVideoFrameCopy->origin ) // means the image is inverted { Trang 81 Luận văn tốt nghiệp GVHD : Ths Phan Thanh Minh cvFlip( pVideoFrameCopy, 0, ); pVideoFrameCopy->origin = 0; } } // CAMSHIFT_WAPPER.cpp int createTracker(const IplImage * pImg) { // Allocate the main data structures ahead of time float * pRanges = rangesArr; pHSVImg = cvCreateImage( cvGetSize(pImg), 8, ); pHueImg = cvCreateImage( cvGetSize(pImg), 8, ); pMask = cvCreateImage( cvGetSize(pImg), 8, ); pProbImg = cvCreateImage( cvGetSize(pImg), 8, ); pHist = cvCreateHist( 1, &nHistBins, CV_HIST_ARRAY, &pRanges, ); return 1; } // releaseTracker() // void releaseTracker() { // Release all tracker resources cvReleaseImage( &pHSVImg ); cvReleaseImage( &pHueImg ); cvReleaseImage( &pMask ); cvReleaseImage( &pProbImg ); cvReleaseHist( &pHist ); } Trang 82 Luận văn tốt nghiệp GVHD : Ths Phan Thanh Minh void startTracking(IplImage * pImg, CvRect * pFaceRect) { float maxVal = 0.f; // Make sure internal data structures have been allocated if( !pHist ) createTracker(pImg); // Create a new hue image updateHueImage(pImg); // Create a histogram representation for the face cvSetImageROI( pHueImg, *pFaceRect ); cvSetImageROI( pMask, *pFaceRect ); cvCalcHist( &pHueImg, pHist, 0, pMask ); cvGetMinMaxHistValue( pHist, 0, &maxVal, 0, ); cvConvertScale( pHist->bins, pHist->bins, maxVal? 255.0/maxVal : 0, ); cvResetImageROI( pHueImg ); cvResetImageROI( pMask ); // Store the previous face location prevFaceRect = *pFaceRect; } void updateHueImage(const IplImage * pImg) { // Convert to HSV color model cvCvtColor( pImg, pHSVImg, CV_RGB2HSV ); // Mask out-of-range values cvInRangeS( pHSVImg, cvScalar(H_MIN , S_MIN , V_MIN ,0), cvScalar(H_MAX , S_MAX , V_MAX ,0), pMask ); Trang 83 Luận văn tốt nghiệp GVHD : Ths Phan Thanh Minh // Extract the hue channel cvSplit( pHSVImg, pHueImg, 0, 0, ); } CvBox2D track(IplImage * pImg) { CvConnectedComp components; // Create a new hue image updateHueImage(pImg); // Create a probability image based on the face histogram cvCalcBackProject( &pHueImg, pProbImg, pHist ); cvAnd( pProbImg, pMask, pProbImg, ); // cvShowImage( "After Color Filtering", pProbImg ); // Use CamShift to find the center of the new face probability if (prevFaceRect.x >0 && prevFaceRect.y >0 && prevFaceRect.width >0 && prevFaceRect.height >0 ) { cvCamShift( pProbImg, prevFaceRect, cvTermCriteria( CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, ), &components, &faceBox ); // Update face location and angle prevFaceRect = components.rect; faceBox.angle = -faceBox.angle; return faceBox; } else { Trang 84 Luận văn tốt nghiệp GVHD : Ths Phan Thanh Minh prevFaceRect.x =2; prevFaceRect.y=2; prevFaceRect.width =2; prevFaceRect.height =2; faceBox.size.height=2; faceBox.size.width=2; faceBox.center.x=2; faceBox.center.y=2; return faceBox; } } // Capture.cpp IplImage * nextVideoFrame() { IplImage * pVideoFrame = cvQueryFrame( pCapture ); if( !pVideoFrame ) fprintf(stderr, "failed to get a video frame\n"); return pVideoFrame; } // facedet.cpp int initFaceDet(const char * haarCascadePath) { if( !(pStorage = cvCreateMemStorage(0)) ) { fprintf(stderr, "Can\'t allocate memory for face detection\n"); return 0; Trang 85 Luận văn tốt nghiệp GVHD : Ths Phan Thanh Minh } pCascade = (CvHaarClassifierCascade *)cvLoad( haarCascadePath, 0, 0, ); if( !pCascade ) { fprintf(stderr, "Can\'t load Haar classifier cascade from\n" " %s\n" "Please check that this is the correct path\n", haarCascadePath); return 0; } return 1; } void closeFaceDet() { if(pCascade) cvReleaseHaarClassifierCascade(&pCascade); if(pStorage) cvReleaseMemStorage(&pStorage); } ////////////////////////////////// // detectFace using HAAR CASCADE CvRect * detectFace(IplImage * pImg) { CvRect* r = 0; // detect faces in image int minFaceSize = pImg->width / 5; pFaceRectSeq = cvHaarDetectObjects (pImg, pCascade, pStorage, 1.1, // increase search scale by 10% each pass 6, // require six neighbors Trang 86 Luận văn tốt nghiệp GVHD : Ths Phan Thanh Minh CV_HAAR_DO_CANNY_PRUNING, // skip regions unlikely to contain a face cvSize(minFaceSize, minFaceSize)); // if one or more faces are detected, return the first one if( pFaceRectSeq && pFaceRectSeq->total ) r = (CvRect*)cvGetSeqElem(pFaceRectSeq, 0); return r; } Trang 87