1 //use the camera to aid the decision to sleep.
2 //Copyright 2009 Daniel Watson
4 use a camera to prevent screensaver
5 Copyright (C) 2009 daniel watson, ozzloy@gmail.com
7 This program is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>.
21 This file is part of oble.
23 oble is free software: you can redistribute it and/or modify
24 it under the terms of the GNU General Public License as published by
25 the Free Software Foundation, either version 3 of the License, or
26 (at your option) any later version.
28 oble is distributed in the hope that it will be useful,
29 but WITHOUT ANY WARRANTY; without even the implied warranty of
30 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
31 GNU General Public License for more details.
33 You should have received a copy of the GNU General Public License
34 along with oble. If not, see <http://www.gnu.org/licenses/>.
48 static string cascade_filename
= "";
50 // argument for cvFlip(src, dest, FLIP_TYPE)
55 CvHaarClassifierCascade
* load_object_detector(const char* cascade_path
)
57 return (CvHaarClassifierCascade
*)cvLoad(cascade_path
);
60 void detect_and_draw_objects(IplImage
* image
,
61 CvHaarClassifierCascade
* cascade
,
64 IplImage
* small_image
= image
;
65 CvMemStorage
* storage
= cvCreateMemStorage(0);
68 static int saw_last_time
= 0;
70 /* if the flag is specified, down-scale the input image to get a
71 performance boost w/o loosing quality (perhaps) */
74 small_image
= cvCreateImage(cvSize(image
->width
/2,image
->height
/2),
76 cvPyrDown(image
, small_image
, CV_GAUSSIAN_5x5
);
80 /* use the fastest variant */
81 faces
= cvHaarDetectObjects(small_image
, cascade
, storage
, 1.2, 2,
82 CV_HAAR_DO_CANNY_PRUNING
);
86 t_current
= time(NULL
);
93 if(DEBUG
)printf("\t\tpoking\n");
95 system("gnome-screensaver-command --poke");
104 printf(":( no face \n");
108 /* draw all the rectangles */
109 for(i
= 0; i
< faces
->total
; i
++)
111 /* extract the rectangles only */
112 CvRect face
= *(CvRect
*)cvGetSeqElem(faces
, i
);
113 CvPoint upperLeft
= cvPoint(face
.x
* scale
, face
.y
* scale
);
114 CvPoint bottomRight
= cvPoint((face
.x
+ face
.width
) * scale
,
115 (face
.y
+ face
.height
) * scale
);
116 cvRectangle(image
, upperLeft
, bottomRight
, CV_RGB(255,0,0), 3);
119 if(small_image
!= image
)
120 cvReleaseImage(&small_image
);
121 cvReleaseMemStorage(&storage
);
124 void screensave(time_t t_current
)
126 static int last_elapse
= 0;
127 static int activated
= 0;
128 int elapse
= difftime(time(NULL
), t_current
);
130 if(elapse
> timeout
&& elapse
!= last_elapse
)
132 last_elapse
= elapse
;
135 printf("elapse = %d\n", elapse
);
139 printf("activated\n");
141 system("gnome-screensaver-command -a");
144 if(elapse
< timeout
&& activated
)
146 printf("deactivated\n");
148 system("gnome-screensaver-command -d");
152 int parse_opts(int argc
, char **argv
)
155 //int opterr=0, optopt=0, optind=0;
157 // int getopt(int argc, char **argv, const char *options);
159 const char *options
= "c:";
160 while((c
= getopt(argc
, argv
, options
)) != -1)
164 cascade_filename
= string(optarg
);
165 printf("option c, argument = %s\n", optarg
);
168 printf("option -%c requires an argument.\n", optopt
);
169 else if(isprint (optopt
))
170 printf("unknown option `-%c'.\n", optopt
);
172 printf("unknown option char `\\x%x'.\n", optopt
);
173 goto known_args_processed
;
177 known_args_processed
:
179 for(index
= optind
; index
< argc
; index
++)
180 printf("Non-option arg %s\n", argv
[index
]);
185 // A Simple Camera Capture Framework.
186 int main(int argc
, char** argv
)
188 if(parse_opts(argc
, argv
)) return 0;
190 if(cascade_filename
== "") cascade_filename
= string(argv
[1]);
191 CvHaarClassifierCascade
* cascade
=
192 load_object_detector(cascade_filename
.c_str());
194 CvCapture
* capture
= cvCaptureFromCAM(CV_CAP_ANY
);
196 cerr
<< "ERROR: capture is NULL " << endl
;
201 // Create a window in which the captured images will be presented
202 cvNamedWindow("mywindow", CV_WINDOW_AUTOSIZE
);
204 IplImage
* frame
= cvQueryFrame(capture
);
206 cerr
<< "ERROR: frame is null..." << endl
;
211 cvCreateImage(cvGetSize(frame
), frame
->depth
, frame
->nChannels
);
212 t_current
= time(NULL
);
213 // Show the image captured from the camera in the window and repeat
216 frame
= cvQueryFrame(capture
);
218 cerr
<< "ERROR: frame is null..." << endl
;
223 //flip the image so displayed right/left corresponds to physical right/left
224 cvFlip(frame
, mirrored
, MIRROR
);
226 detect_and_draw_objects(mirrored
, cascade
, 1);
227 cvShowImage("mywindow", mirrored
);
228 // Do not release the frame!
229 //screensave(t_current);
231 //If ESC key pressed, Key=0x10001B under OpenCV 0.9.7(linux version),
232 //remove higher bits using AND operator
233 if((cvWaitKey(100) & 255) == 27) break;
236 // Release the capture device housekeeping
237 cvReleaseCapture(&capture
);
238 cvDestroyWindow("mywindow");
239 cvReleaseImage(&mirrored
);