Pramod Nataraja
/
Eye_Detection
Eye Detection Using Open CV(Should be run on a system with Open CV library)
main.cpp@0:728af114b613, 2011-12-14 (annotated)
- Committer:
- pramodnataraja
- Date:
- Wed Dec 14 04:51:31 2011 +0000
- Revision:
- 0:728af114b613
Version 1.0
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
pramodnataraja | 0:728af114b613 | 1 | /* This code should be compiled on a system with Open CV library installed and run from Visual Studio if running from Windows platform*/ |
pramodnataraja | 0:728af114b613 | 2 | |
pramodnataraja | 0:728af114b613 | 3 | #include "stdafx.h" |
pramodnataraja | 0:728af114b613 | 4 | #include "cv.h" |
pramodnataraja | 0:728af114b613 | 5 | #include "highgui.h" |
pramodnataraja | 0:728af114b613 | 6 | |
pramodnataraja | 0:728af114b613 | 7 | #include <iostream> |
pramodnataraja | 0:728af114b613 | 8 | #include <conio.h> |
pramodnataraja | 0:728af114b613 | 9 | #include <string.h> |
pramodnataraja | 0:728af114b613 | 10 | #include <time.h> |
pramodnataraja | 0:728af114b613 | 11 | #include <stdio.h> |
pramodnataraja | 0:728af114b613 | 12 | #include <windows.h> |
pramodnataraja | 0:728af114b613 | 13 | |
pramodnataraja | 0:728af114b613 | 14 | |
pramodnataraja | 0:728af114b613 | 15 | using namespace std; |
pramodnataraja | 0:728af114b613 | 16 | using namespace cv; |
pramodnataraja | 0:728af114b613 | 17 | |
pramodnataraja | 0:728af114b613 | 18 | #define SCALE 1 |
pramodnataraja | 0:728af114b613 | 19 | |
pramodnataraja | 0:728af114b613 | 20 | #define SCALING_FACTOR_FACE 1.1 |
pramodnataraja | 0:728af114b613 | 21 | #define MIN_SIZE_FACE 30 |
pramodnataraja | 0:728af114b613 | 22 | #define FLAGS_FACE CV_HAAR_FIND_BIGGEST_OBJECT |
pramodnataraja | 0:728af114b613 | 23 | #define COLOR_FACE CV_RGB(255, 0, 0) |
pramodnataraja | 0:728af114b613 | 24 | #define FEATURE_FACE "C:/OpenCV2.0/data/haarcascades/haarcascade_frontalface_alt.xml" //You need to put the correct path to your templates |
pramodnataraja | 0:728af114b613 | 25 | |
pramodnataraja | 0:728af114b613 | 26 | #define EYE |
pramodnataraja | 0:728af114b613 | 27 | #define SCALING_FACTOR_EYE 1.1 |
pramodnataraja | 0:728af114b613 | 28 | #define MIN_SIZE_EYE 20 |
pramodnataraja | 0:728af114b613 | 29 | #define FLAGS_EYE CV_HAAR_FIND_BIGGEST_OBJECT | CV_HAAR_DO_ROUGH_SEARCH | CV_HAAR_SCALE_IMAGE | CV_HAAR_DO_CANNY_PRUNING |
pramodnataraja | 0:728af114b613 | 30 | #define COLOR_EYE CV_RGB(0, 255, 0) |
pramodnataraja | 0:728af114b613 | 31 | #define FEATURE_EYE "C:/OpenCV2.0/data/haarcascades/haarcascade_mcs_eyepair_small.xml" |
pramodnataraja | 0:728af114b613 | 32 | |
pramodnataraja | 0:728af114b613 | 33 | //#define NOSE |
pramodnataraja | 0:728af114b613 | 34 | #define SCALING_FACTOR_NOSE 1.1 |
pramodnataraja | 0:728af114b613 | 35 | #define MIN_SIZE_NOSE 20 |
pramodnataraja | 0:728af114b613 | 36 | #define FLAGS_NOSE CV_HAAR_DO_CANNY_PRUNING |
pramodnataraja | 0:728af114b613 | 37 | #define COLOR_NOSE CV_RGB(0, 0, 255) |
pramodnataraja | 0:728af114b613 | 38 | #define FEATURE_NOSE "C:/OpenCV2.0/data/haarcascades/haarcascade_mcs_nose.xml" |
pramodnataraja | 0:728af114b613 | 39 | |
pramodnataraja | 0:728af114b613 | 40 | #define THRESHOLD_X 10 |
pramodnataraja | 0:728af114b613 | 41 | #define THRESHOLD_Y 13 |
pramodnataraja | 0:728af114b613 | 42 | |
pramodnataraja | 0:728af114b613 | 43 | #define DISCARD_VALUE 10 |
pramodnataraja | 0:728af114b613 | 44 | |
pramodnataraja | 0:728af114b613 | 45 | #define strlen(cBufferOut) 1 |
pramodnataraja | 0:728af114b613 | 46 | |
pramodnataraja | 0:728af114b613 | 47 | int detect_faces(Mat& img); |
pramodnataraja | 0:728af114b613 | 48 | |
pramodnataraja | 0:728af114b613 | 49 | CascadeClassifier cascade; |
pramodnataraja | 0:728af114b613 | 50 | CascadeClassifier cascade_eye; |
pramodnataraja | 0:728af114b613 | 51 | CascadeClassifier cascade_nose; |
pramodnataraja | 0:728af114b613 | 52 | CvMemStorage* storage = (CvMemStorage*)NULL; |
pramodnataraja | 0:728af114b613 | 53 | |
pramodnataraja | 0:728af114b613 | 54 | int disp_x = 0; |
pramodnataraja | 0:728af114b613 | 55 | int disp_y = 0; |
pramodnataraja | 0:728af114b613 | 56 | int prev_disp_x = 0; |
pramodnataraja | 0:728af114b613 | 57 | int prev_disp_y = 0; |
pramodnataraja | 0:728af114b613 | 58 | int prev_pos_x = 0; |
pramodnataraja | 0:728af114b613 | 59 | int prev_pos_y = 0; |
pramodnataraja | 0:728af114b613 | 60 | int cur_pos_x = 0; |
pramodnataraja | 0:728af114b613 | 61 | int cur_pos_y = 0; |
pramodnataraja | 0:728af114b613 | 62 | |
pramodnataraja | 0:728af114b613 | 63 | HANDLE hSerial; |
pramodnataraja | 0:728af114b613 | 64 | DCB dcb; |
pramodnataraja | 0:728af114b613 | 65 | |
pramodnataraja | 0:728af114b613 | 66 | // A Simple Camera Capture Framework |
pramodnataraja | 0:728af114b613 | 67 | int main() |
pramodnataraja | 0:728af114b613 | 68 | { |
pramodnataraja | 0:728af114b613 | 69 | /******************************************************* SETUP SERIAL COM PORT *********************************************/ |
pramodnataraja | 0:728af114b613 | 70 | DWORD cBytesOut, cBytesIn; |
pramodnataraja | 0:728af114b613 | 71 | DWORD dwMask; |
pramodnataraja | 0:728af114b613 | 72 | |
pramodnataraja | 0:728af114b613 | 73 | char* cBufferOut; |
pramodnataraja | 0:728af114b613 | 74 | char front = '1';//"front"; |
pramodnataraja | 0:728af114b613 | 75 | char back = '2';//"back"; |
pramodnataraja | 0:728af114b613 | 76 | char left = '3';//"left"; |
pramodnataraja | 0:728af114b613 | 77 | char right = '4';//"right"; |
pramodnataraja | 0:728af114b613 | 78 | char half_front_right = '5';//"half_front_right"; |
pramodnataraja | 0:728af114b613 | 79 | char half_front_left = '6';//"half_front_left"; |
pramodnataraja | 0:728af114b613 | 80 | char half_back_right = '7';//"half_back_right"; |
pramodnataraja | 0:728af114b613 | 81 | char half_back_left = '8';//"half_back_left"; |
pramodnataraja | 0:728af114b613 | 82 | char onOff = '0';//"onOff"; |
pramodnataraja | 0:728af114b613 | 83 | |
pramodnataraja | 0:728af114b613 | 84 | int valid = 0; |
pramodnataraja | 0:728af114b613 | 85 | int discard = 0; |
pramodnataraja | 0:728af114b613 | 86 | int firstValue = 1; |
pramodnataraja | 0:728af114b613 | 87 | |
pramodnataraja | 0:728af114b613 | 88 | hSerial = CreateFile(_T("COM2"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); |
pramodnataraja | 0:728af114b613 | 89 | |
pramodnataraja | 0:728af114b613 | 90 | if(hSerial == INVALID_HANDLE_VALUE) |
pramodnataraja | 0:728af114b613 | 91 | { |
pramodnataraja | 0:728af114b613 | 92 | printf("Failure\n"); |
pramodnataraja | 0:728af114b613 | 93 | printf("%d\n",hSerial); |
pramodnataraja | 0:728af114b613 | 94 | printf("%d\n",GetLastError()); |
pramodnataraja | 0:728af114b613 | 95 | } |
pramodnataraja | 0:728af114b613 | 96 | |
pramodnataraja | 0:728af114b613 | 97 | GetCommState(hSerial, &dcb); |
pramodnataraja | 0:728af114b613 | 98 | dcb.BaudRate = 9600; |
pramodnataraja | 0:728af114b613 | 99 | dcb.ByteSize = 8; |
pramodnataraja | 0:728af114b613 | 100 | dcb.Parity = NOPARITY; |
pramodnataraja | 0:728af114b613 | 101 | dcb.StopBits = ONESTOPBIT; |
pramodnataraja | 0:728af114b613 | 102 | SetCommState(hSerial, &dcb); |
pramodnataraja | 0:728af114b613 | 103 | /*************************************************************************************************************/ |
pramodnataraja | 0:728af114b613 | 104 | |
pramodnataraja | 0:728af114b613 | 105 | double t; |
pramodnataraja | 0:728af114b613 | 106 | |
pramodnataraja | 0:728af114b613 | 107 | CvCapture* capture = cvCaptureFromCAM( CV_CAP_ANY ); |
pramodnataraja | 0:728af114b613 | 108 | |
pramodnataraja | 0:728af114b613 | 109 | if ( !capture ) |
pramodnataraja | 0:728af114b613 | 110 | { |
pramodnataraja | 0:728af114b613 | 111 | fprintf( stderr, "ERROR: capture is NULL \n" ); |
pramodnataraja | 0:728af114b613 | 112 | getchar(); |
pramodnataraja | 0:728af114b613 | 113 | return -1; |
pramodnataraja | 0:728af114b613 | 114 | } |
pramodnataraja | 0:728af114b613 | 115 | |
pramodnataraja | 0:728af114b613 | 116 | // Create a window in which the captured images will be presented |
pramodnataraja | 0:728af114b613 | 117 | cvNamedWindow( "mywindow", CV_WINDOW_AUTOSIZE ); |
pramodnataraja | 0:728af114b613 | 118 | |
pramodnataraja | 0:728af114b613 | 119 | // Show the image captured from the camera in the window and repeat |
pramodnataraja | 0:728af114b613 | 120 | while ( 1 ) |
pramodnataraja | 0:728af114b613 | 121 | { |
pramodnataraja | 0:728af114b613 | 122 | // Get one frame |
pramodnataraja | 0:728af114b613 | 123 | IplImage* iplImg = cvQueryFrame( capture ); |
pramodnataraja | 0:728af114b613 | 124 | Mat frame, frameCopy; |
pramodnataraja | 0:728af114b613 | 125 | |
pramodnataraja | 0:728af114b613 | 126 | frame = iplImg; |
pramodnataraja | 0:728af114b613 | 127 | if( frame.empty() ) |
pramodnataraja | 0:728af114b613 | 128 | break; |
pramodnataraja | 0:728af114b613 | 129 | if( iplImg->origin == IPL_ORIGIN_TL ) |
pramodnataraja | 0:728af114b613 | 130 | frame.copyTo( frameCopy ); |
pramodnataraja | 0:728af114b613 | 131 | else |
pramodnataraja | 0:728af114b613 | 132 | flip( frame, frameCopy, 0 ); |
pramodnataraja | 0:728af114b613 | 133 | |
pramodnataraja | 0:728af114b613 | 134 | if (frameCopy.empty()) |
pramodnataraja | 0:728af114b613 | 135 | { |
pramodnataraja | 0:728af114b613 | 136 | fprintf( stderr, "ERROR: frame is null...\n" ); |
pramodnataraja | 0:728af114b613 | 137 | getchar(); |
pramodnataraja | 0:728af114b613 | 138 | break; |
pramodnataraja | 0:728af114b613 | 139 | } |
pramodnataraja | 0:728af114b613 | 140 | |
pramodnataraja | 0:728af114b613 | 141 | if(discard <= 0) |
pramodnataraja | 0:728af114b613 | 142 | { |
pramodnataraja | 0:728af114b613 | 143 | prev_pos_x = cur_pos_x; |
pramodnataraja | 0:728af114b613 | 144 | prev_pos_y = cur_pos_y; |
pramodnataraja | 0:728af114b613 | 145 | |
pramodnataraja | 0:728af114b613 | 146 | prev_disp_x = disp_x; |
pramodnataraja | 0:728af114b613 | 147 | prev_disp_y = disp_y; |
pramodnataraja | 0:728af114b613 | 148 | |
pramodnataraja | 0:728af114b613 | 149 | t = (double)cvGetTickCount(); |
pramodnataraja | 0:728af114b613 | 150 | detect_faces(frameCopy); |
pramodnataraja | 0:728af114b613 | 151 | t = (double)cvGetTickCount() - t; |
pramodnataraja | 0:728af114b613 | 152 | |
pramodnataraja | 0:728af114b613 | 153 | disp_x = cur_pos_x - prev_pos_x; |
pramodnataraja | 0:728af114b613 | 154 | disp_y = cur_pos_y - prev_pos_y; |
pramodnataraja | 0:728af114b613 | 155 | |
pramodnataraja | 0:728af114b613 | 156 | if(((disp_x < THRESHOLD_X) && (disp_x > (-1 * THRESHOLD_X))) || (firstValue == 1)) |
pramodnataraja | 0:728af114b613 | 157 | disp_x = 0; |
pramodnataraja | 0:728af114b613 | 158 | |
pramodnataraja | 0:728af114b613 | 159 | if(((disp_y < THRESHOLD_Y) && (disp_y > (-1 * THRESHOLD_Y))) || (firstValue == 1)) |
pramodnataraja | 0:728af114b613 | 160 | disp_y = 0; |
pramodnataraja | 0:728af114b613 | 161 | |
pramodnataraja | 0:728af114b613 | 162 | if(firstValue == 1) |
pramodnataraja | 0:728af114b613 | 163 | firstValue = 0; |
pramodnataraja | 0:728af114b613 | 164 | |
pramodnataraja | 0:728af114b613 | 165 | /* if((disp_x != 0) && (prev_disp_x == 0)) |
pramodnataraja | 0:728af114b613 | 166 | { |
pramodnataraja | 0:728af114b613 | 167 | printf("disp_x = %d\n", disp_x); |
pramodnataraja | 0:728af114b613 | 168 | } |
pramodnataraja | 0:728af114b613 | 169 | if((disp_y != 0) && (prev_disp_y == 0)) |
pramodnataraja | 0:728af114b613 | 170 | { |
pramodnataraja | 0:728af114b613 | 171 | printf("\tdisp_y = %d\n", disp_y); |
pramodnataraja | 0:728af114b613 | 172 | }*/ |
pramodnataraja | 0:728af114b613 | 173 | |
pramodnataraja | 0:728af114b613 | 174 | valid = 1; |
pramodnataraja | 0:728af114b613 | 175 | |
pramodnataraja | 0:728af114b613 | 176 | if((disp_x == 0) && (disp_y < 0) && (prev_disp_y == 0)) |
pramodnataraja | 0:728af114b613 | 177 | { |
pramodnataraja | 0:728af114b613 | 178 | printf("front"); |
pramodnataraja | 0:728af114b613 | 179 | cBufferOut = &front; |
pramodnataraja | 0:728af114b613 | 180 | } |
pramodnataraja | 0:728af114b613 | 181 | else if((disp_x == 0) && (disp_y > 0) && (prev_disp_y == 0)) |
pramodnataraja | 0:728af114b613 | 182 | { |
pramodnataraja | 0:728af114b613 | 183 | printf("back"); |
pramodnataraja | 0:728af114b613 | 184 | cBufferOut = &back; |
pramodnataraja | 0:728af114b613 | 185 | } |
pramodnataraja | 0:728af114b613 | 186 | else if((disp_x < 0) && (disp_y == 0) && (prev_disp_x == 0)) |
pramodnataraja | 0:728af114b613 | 187 | { |
pramodnataraja | 0:728af114b613 | 188 | printf("right"); |
pramodnataraja | 0:728af114b613 | 189 | cBufferOut = &right; |
pramodnataraja | 0:728af114b613 | 190 | } |
pramodnataraja | 0:728af114b613 | 191 | else if((disp_x > 0) && (disp_y == 0) && (prev_disp_x == 0)) |
pramodnataraja | 0:728af114b613 | 192 | { |
pramodnataraja | 0:728af114b613 | 193 | printf("left"); |
pramodnataraja | 0:728af114b613 | 194 | cBufferOut = &left; |
pramodnataraja | 0:728af114b613 | 195 | } |
pramodnataraja | 0:728af114b613 | 196 | else if((disp_x < 0) && (prev_disp_x == 0) && (disp_y < 0) && (prev_disp_y == 0)) |
pramodnataraja | 0:728af114b613 | 197 | { |
pramodnataraja | 0:728af114b613 | 198 | printf("half_front_right"); |
pramodnataraja | 0:728af114b613 | 199 | cBufferOut = &half_front_right; |
pramodnataraja | 0:728af114b613 | 200 | } |
pramodnataraja | 0:728af114b613 | 201 | else if((disp_x > 0) && (prev_disp_x == 0) && (disp_y < 0) && (prev_disp_y == 0)) |
pramodnataraja | 0:728af114b613 | 202 | { |
pramodnataraja | 0:728af114b613 | 203 | printf("half_front_left"); |
pramodnataraja | 0:728af114b613 | 204 | cBufferOut = &half_front_left; |
pramodnataraja | 0:728af114b613 | 205 | } |
pramodnataraja | 0:728af114b613 | 206 | else if((disp_x < 0) && (prev_disp_x == 0) && (disp_y > 0) && (prev_disp_y == 0)) |
pramodnataraja | 0:728af114b613 | 207 | { |
pramodnataraja | 0:728af114b613 | 208 | printf("half_back_right"); |
pramodnataraja | 0:728af114b613 | 209 | cBufferOut = &half_back_right; |
pramodnataraja | 0:728af114b613 | 210 | } |
pramodnataraja | 0:728af114b613 | 211 | else if((disp_x > 0) && (prev_disp_x == 0) && (disp_y > 0) && (prev_disp_y == 0)) |
pramodnataraja | 0:728af114b613 | 212 | { |
pramodnataraja | 0:728af114b613 | 213 | printf("half_back_left"); |
pramodnataraja | 0:728af114b613 | 214 | cBufferOut = &half_back_left; |
pramodnataraja | 0:728af114b613 | 215 | } |
pramodnataraja | 0:728af114b613 | 216 | else |
pramodnataraja | 0:728af114b613 | 217 | { |
pramodnataraja | 0:728af114b613 | 218 | valid = 0; |
pramodnataraja | 0:728af114b613 | 219 | } |
pramodnataraja | 0:728af114b613 | 220 | |
pramodnataraja | 0:728af114b613 | 221 | if(valid != 0) |
pramodnataraja | 0:728af114b613 | 222 | { |
pramodnataraja | 0:728af114b613 | 223 | printf("\n"); |
pramodnataraja | 0:728af114b613 | 224 | //printf("output = %c \n",*cBufferOut); |
pramodnataraja | 0:728af114b613 | 225 | |
pramodnataraja | 0:728af114b613 | 226 | if(!WriteFile(hSerial, cBufferOut, 1, &cBytesOut, NULL)) |
pramodnataraja | 0:728af114b613 | 227 | { |
pramodnataraja | 0:728af114b613 | 228 | printf("File write error\n"); |
pramodnataraja | 0:728af114b613 | 229 | } |
pramodnataraja | 0:728af114b613 | 230 | |
pramodnataraja | 0:728af114b613 | 231 | discard = DISCARD_VALUE; |
pramodnataraja | 0:728af114b613 | 232 | } |
pramodnataraja | 0:728af114b613 | 233 | } |
pramodnataraja | 0:728af114b613 | 234 | else |
pramodnataraja | 0:728af114b613 | 235 | { |
pramodnataraja | 0:728af114b613 | 236 | detect_faces(frameCopy); |
pramodnataraja | 0:728af114b613 | 237 | discard--; |
pramodnataraja | 0:728af114b613 | 238 | } |
pramodnataraja | 0:728af114b613 | 239 | |
pramodnataraja | 0:728af114b613 | 240 | if((cvWaitKey(10) & 255) == 32) |
pramodnataraja | 0:728af114b613 | 241 | { |
pramodnataraja | 0:728af114b613 | 242 | printf("onoff\n"); |
pramodnataraja | 0:728af114b613 | 243 | cBufferOut = &onOff; |
pramodnataraja | 0:728af114b613 | 244 | |
pramodnataraja | 0:728af114b613 | 245 | if(!WriteFile(hSerial, cBufferOut, 1, &cBytesOut, NULL)) |
pramodnataraja | 0:728af114b613 | 246 | { |
pramodnataraja | 0:728af114b613 | 247 | printf("File write error.........\n"); |
pramodnataraja | 0:728af114b613 | 248 | } |
pramodnataraja | 0:728af114b613 | 249 | } |
pramodnataraja | 0:728af114b613 | 250 | |
pramodnataraja | 0:728af114b613 | 251 | //imshow( "mywindow", frame ); |
pramodnataraja | 0:728af114b613 | 252 | |
pramodnataraja | 0:728af114b613 | 253 | // Do not release the frame! |
pramodnataraja | 0:728af114b613 | 254 | //If ESC key pressed, Key=0x10001B under OpenCV 0.9.7(linux version), |
pramodnataraja | 0:728af114b613 | 255 | //remove higher bits using AND operator |
pramodnataraja | 0:728af114b613 | 256 | if ( (cvWaitKey(10) & 255) == 27 ) break; |
pramodnataraja | 0:728af114b613 | 257 | |
pramodnataraja | 0:728af114b613 | 258 | |
pramodnataraja | 0:728af114b613 | 259 | } |
pramodnataraja | 0:728af114b613 | 260 | // Release the capture device housekeeping |
pramodnataraja | 0:728af114b613 | 261 | cvReleaseCapture( &capture ); |
pramodnataraja | 0:728af114b613 | 262 | cvDestroyWindow( "mywindow" ); |
pramodnataraja | 0:728af114b613 | 263 | |
pramodnataraja | 0:728af114b613 | 264 | CloseHandle(hSerial); |
pramodnataraja | 0:728af114b613 | 265 | |
pramodnataraja | 0:728af114b613 | 266 | return 0; |
pramodnataraja | 0:728af114b613 | 267 | } |
pramodnataraja | 0:728af114b613 | 268 | |
pramodnataraja | 0:728af114b613 | 269 | |
pramodnataraja | 0:728af114b613 | 270 | |
pramodnataraja | 0:728af114b613 | 271 | int detect_faces(Mat& img) |
pramodnataraja | 0:728af114b613 | 272 | { |
pramodnataraja | 0:728af114b613 | 273 | Mat gray, img2; |
pramodnataraja | 0:728af114b613 | 274 | Mat smallImg( cvRound (img.rows/SCALE), cvRound(img.cols/SCALE), CV_8UC1 ); |
pramodnataraja | 0:728af114b613 | 275 | |
pramodnataraja | 0:728af114b613 | 276 | cvtColor( img, gray, CV_BGR2GRAY ); |
pramodnataraja | 0:728af114b613 | 277 | resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR ); |
pramodnataraja | 0:728af114b613 | 278 | equalizeHist( smallImg, smallImg ); |
pramodnataraja | 0:728af114b613 | 279 | |
pramodnataraja | 0:728af114b613 | 280 | #pragma region FEATURE FILES |
pramodnataraja | 0:728af114b613 | 281 | /* Load the face detector and create memory storage |
pramodnataraja | 0:728af114b613 | 282 | `cascade` and `storage` are global variables */ |
pramodnataraja | 0:728af114b613 | 283 | if (cascade.empty()) |
pramodnataraja | 0:728af114b613 | 284 | { |
pramodnataraja | 0:728af114b613 | 285 | char* file = FEATURE_FACE; //haarcascade_eye_tree_eyeglasses.xml"; |
pramodnataraja | 0:728af114b613 | 286 | |
pramodnataraja | 0:728af114b613 | 287 | |
pramodnataraja | 0:728af114b613 | 288 | if(!cascade.load(file)) |
pramodnataraja | 0:728af114b613 | 289 | { |
pramodnataraja | 0:728af114b613 | 290 | fprintf( stderr, "ERROR: Invalid cascade path...\n" ); |
pramodnataraja | 0:728af114b613 | 291 | getchar(); |
pramodnataraja | 0:728af114b613 | 292 | return 0; |
pramodnataraja | 0:728af114b613 | 293 | } |
pramodnataraja | 0:728af114b613 | 294 | |
pramodnataraja | 0:728af114b613 | 295 | storage = cvCreateMemStorage(0); |
pramodnataraja | 0:728af114b613 | 296 | } |
pramodnataraja | 0:728af114b613 | 297 | |
pramodnataraja | 0:728af114b613 | 298 | if (cascade_nose.empty()) |
pramodnataraja | 0:728af114b613 | 299 | { |
pramodnataraja | 0:728af114b613 | 300 | char* file = FEATURE_NOSE; //haarcascade_eye_tree_eyeglasses.xml"; |
pramodnataraja | 0:728af114b613 | 301 | |
pramodnataraja | 0:728af114b613 | 302 | if(!cascade_nose.load(file)) |
pramodnataraja | 0:728af114b613 | 303 | { |
pramodnataraja | 0:728af114b613 | 304 | fprintf( stderr, "ERROR: Invalid cascade path...\n" ); |
pramodnataraja | 0:728af114b613 | 305 | getchar(); |
pramodnataraja | 0:728af114b613 | 306 | return 0; |
pramodnataraja | 0:728af114b613 | 307 | } |
pramodnataraja | 0:728af114b613 | 308 | } |
pramodnataraja | 0:728af114b613 | 309 | |
pramodnataraja | 0:728af114b613 | 310 | if (cascade_eye.empty()) |
pramodnataraja | 0:728af114b613 | 311 | { |
pramodnataraja | 0:728af114b613 | 312 | char* file = FEATURE_EYE;//haarcascade_eye_tree_eyeglasses.xml"; |
pramodnataraja | 0:728af114b613 | 313 | |
pramodnataraja | 0:728af114b613 | 314 | if(!cascade_eye.load(file)) |
pramodnataraja | 0:728af114b613 | 315 | { |
pramodnataraja | 0:728af114b613 | 316 | fprintf( stderr, "ERROR: Invalid cascade path...\n" ); |
pramodnataraja | 0:728af114b613 | 317 | getchar(); |
pramodnataraja | 0:728af114b613 | 318 | return 0; |
pramodnataraja | 0:728af114b613 | 319 | } |
pramodnataraja | 0:728af114b613 | 320 | } |
pramodnataraja | 0:728af114b613 | 321 | #pragma endregion |
pramodnataraja | 0:728af114b613 | 322 | |
pramodnataraja | 0:728af114b613 | 323 | vector<Rect> faces; |
pramodnataraja | 0:728af114b613 | 324 | |
pramodnataraja | 0:728af114b613 | 325 | cascade.detectMultiScale(smallImg, faces, SCALING_FACTOR_FACE, 2, FLAGS_FACE, Size(MIN_SIZE_FACE, MIN_SIZE_FACE) ); |
pramodnataraja | 0:728af114b613 | 326 | |
pramodnataraja | 0:728af114b613 | 327 | for( vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++) |
pramodnataraja | 0:728af114b613 | 328 | { |
pramodnataraja | 0:728af114b613 | 329 | img2 = smallImg(*r); |
pramodnataraja | 0:728af114b613 | 330 | |
pramodnataraja | 0:728af114b613 | 331 | vector<Rect> eyes; |
pramodnataraja | 0:728af114b613 | 332 | vector<Rect> nose; |
pramodnataraja | 0:728af114b613 | 333 | |
pramodnataraja | 0:728af114b613 | 334 | #ifdef EYE |
pramodnataraja | 0:728af114b613 | 335 | cascade_eye.detectMultiScale(img2, eyes, SCALING_FACTOR_EYE, 2, FLAGS_EYE, Size(MIN_SIZE_EYE, MIN_SIZE_EYE) ); |
pramodnataraja | 0:728af114b613 | 336 | |
pramodnataraja | 0:728af114b613 | 337 | for( vector<Rect>::const_iterator nr = eyes.begin(); nr != eyes.end(); nr++ ) |
pramodnataraja | 0:728af114b613 | 338 | { |
pramodnataraja | 0:728af114b613 | 339 | rectangle(smallImg, cvPoint(r->x + nr->x, r->y + nr->y), cvPoint(r->x + nr->x + nr->width, r->y + nr->y + nr->height), COLOR_EYE, 1, 8, 0); |
pramodnataraja | 0:728af114b613 | 340 | cur_pos_x = r->x + nr->x + (nr->width / 2); |
pramodnataraja | 0:728af114b613 | 341 | cur_pos_y = r->y + nr->y + (nr->height / 2); |
pramodnataraja | 0:728af114b613 | 342 | } |
pramodnataraja | 0:728af114b613 | 343 | #endif |
pramodnataraja | 0:728af114b613 | 344 | |
pramodnataraja | 0:728af114b613 | 345 | |
pramodnataraja | 0:728af114b613 | 346 | #ifdef NOSE |
pramodnataraja | 0:728af114b613 | 347 | cascade_nose.detectMultiScale(img2, nose, SCALING_FACTOR_NOSE, 2, FLAGS_NOSE, Size(MIN_SIZE_NOSE, MIN_SIZE_NOSE) ); |
pramodnataraja | 0:728af114b613 | 348 | |
pramodnataraja | 0:728af114b613 | 349 | for( vector<Rect>::const_iterator nr = nose.begin(); nr != nose.end(); nr++ ) |
pramodnataraja | 0:728af114b613 | 350 | //vector<Rect>::const_iterator nr = nose.end() - 1; |
pramodnataraja | 0:728af114b613 | 351 | { |
pramodnataraja | 0:728af114b613 | 352 | rectangle(smallImg, cvPoint(r->x + nr->x, r->y + nr->y), cvPoint(r->x + nr->x + nr->width, r->y + nr->y + nr->height), COLOR_NOSE, 1, 8, 0); |
pramodnataraja | 0:728af114b613 | 353 | cur_pos_x = r->x + nr->x + (nr->width / 2); |
pramodnataraja | 0:728af114b613 | 354 | cur_pos_y = r->y + nr->y + (nr->height / 2); |
pramodnataraja | 0:728af114b613 | 355 | } |
pramodnataraja | 0:728af114b613 | 356 | #endif |
pramodnataraja | 0:728af114b613 | 357 | |
pramodnataraja | 0:728af114b613 | 358 | //if((int)eyes.size() >= 2) |
pramodnataraja | 0:728af114b613 | 359 | { |
pramodnataraja | 0:728af114b613 | 360 | rectangle(smallImg, cvPoint(r->x, r->y), cvPoint(r->x + r->width, r->y + r->height), COLOR_FACE, 1, 8, 0); |
pramodnataraja | 0:728af114b613 | 361 | } |
pramodnataraja | 0:728af114b613 | 362 | } |
pramodnataraja | 0:728af114b613 | 363 | |
pramodnataraja | 0:728af114b613 | 364 | imshow("mywindow",smallImg); |
pramodnataraja | 0:728af114b613 | 365 | |
pramodnataraja | 0:728af114b613 | 366 | return 0; //(int)faces.size(); |
pramodnataraja | 0:728af114b613 | 367 | } |