1 #define CV_NO_BACKWARD_COMPATIBILITY
4 #include "opencv/highgui.h"
10 #include <netinet/in.h>
24 bool detectAndDraw( Mat& img,
25 CascadeClassifier& cascade, CascadeClassifier& nestedCascade,
28 String cascadeName = "haarcascades/haarcascade_frontalface_alt.xml";
29 String nestedCascadeName = "haarcascades/haarcascade_mcs_nose.xml";
31 void log(const char* text) {
35 CascadeClassifier cascade, nestedCascade;
42 void detect(unsigned char* buf,int buf_len) {
46 image = imdecode(Mat(1, buf_len, CV_8U, buf), 1);
50 found = detectAndDraw( image, cascade, nestedCascade, scale );
55 const char* result = "NoTA face detection";
57 int main( int argc, const char** argv )
59 /* Service socket to use for connecting to the service node. */
63 /* The first parameter specifies the service to connect to (SID).
64 * The other parameters are reserved for legacy purposes.
66 sockid = n_connect(DEFAULT_SID, NULL, NULL);
68 /* sockid will be the number of the socket we got (>0), if successful,
69 * or <0 if something went wrong. Let's check:
75 ServiceCallbacks callbacks = {0};
77 callbacks.put_image = &detect;
79 ServiceCallbacks* cb=&callbacks;
81 LOG2("Connected socket %d to service '%d'.\n", sockid, DEFAULT_SID);
83 if( !cascade.load( cascadeName ) )
85 cerr << "ERROR: Could not load classifier cascade" << endl;
88 nestedCascade.load( nestedCascadeName );
90 cvNamedWindow( result, 1 );
94 ServiceMessage* smsg = pack_pdu(GET_IMAGE, NULL, 0, &smsg_len);
96 err = n_send(sockid, smsg, smsg_len, HSSendBlocking);
105 int err = read_smsg(&sockid, HSReceiveNonBlocking, cb);
106 if (err < 0) //error reading service message
111 struct _FACE f = { htonl(face.x), htonl(face.y), htonl(face.r) };
112 smsg = pack_pdu(FACE_FOUND,(uns8*)&f,sizeof(f),&smsg_len);
113 n_send(sockid,smsg,smsg_len,HSSendBlocking);
119 cvDestroyWindow(result);
124 bool detectAndDraw( Mat& img,
125 CascadeClassifier& cascade, CascadeClassifier& nestedCascade,
132 const static Scalar colors[] = { CV_RGB(0,0,255),
140 Mat gray, smallImg( cvRound (img.rows/scale), cvRound(img.cols/scale), CV_8UC1 );
142 cvtColor( img, gray, CV_BGR2GRAY );
143 resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR );
144 equalizeHist( smallImg, smallImg );
146 t = (double)cvGetTickCount();
147 cascade.detectMultiScale( smallImg, faces,
149 |CV_HAAR_FIND_BIGGEST_OBJECT
150 //|CV_HAAR_DO_ROUGH_SEARCH
154 t = (double)cvGetTickCount() - t;
155 printf( "detection time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) );
156 for( vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++, i++ )
159 vector<Rect> nestedObjects;
161 Scalar color = colors[i%8];
163 center.x = cvRound((r->x + r->width*0.5)*scale);
164 center.y = cvRound((r->y + r->height*0.5)*scale);
165 radius = cvRound((r->width + r->height)*0.25*scale);
167 found = true; face.x = center.x; face.y = center.y; face.r = radius;
169 circle( img, center, radius, color, 3, 8, 0 );
170 if( nestedCascade.empty() )
172 smallImgROI = smallImg(*r);
173 nestedCascade.detectMultiScale( smallImgROI, nestedObjects,
175 //|CV_HAAR_FIND_BIGGEST_OBJECT
176 //|CV_HAAR_DO_ROUGH_SEARCH
177 //|CV_HAAR_DO_CANNY_PRUNING
181 for( vector<Rect>::const_iterator nr = nestedObjects.begin(); nr != nestedObjects.end(); nr++ )
183 center.x = cvRound((r->x + nr->x + nr->width*0.5)*scale);
184 center.y = cvRound((r->y + nr->y + nr->height*0.5)*scale);
185 radius = cvRound((nr->width + nr->height)*0.25*scale);
186 circle( img, center, radius, color, 3, 8, 0 );
189 cv::imshow( result, img );