appkit  1.5.1
RoadNarrows Robotics Application Kit
Camera Unit Tests

Fine-grained testing of Camera classes. More...

Functions

static CamRes incRes (const CamRes &resCur)
 Increment resolution to the next comman resolution. More...
 
static CamRes decRes (const CamRes &resCur)
 Decrement resolution to the previous comman resolution. More...
 
static int testCameraCv ()
 Test OpenCv CameraCv class. More...
 
void GtkOnRealizeGstWin (GtkWidget *w, gpointer user_data)
 Realize GStreamer video window callback. More...
 
gboolean GtkAlarm (gpointer user_data)
 Timeout expiry callback. More...
 
int GtkWaitKey (int delay)
 Wait for keypress or timeout. More...
 
gboolean GtkOnKeyPress (GtkWidget *w, GdkEventKey *event, gpointer *user_data)
 Keyboard press event handler. More...
 
static int testCameraGst ()
 Test GStreamer CameraGst class. More...
 
 TEST (Camera, CameraCv)
 Test OpenCv camera class. More...
 
 TEST (Camera, CameraGst)
 Test OpenGst camera class. More...
 

Variables

static const char * TestMenu
 
static gulong GstWinXid = 0
 
static uint_t GtkLastKey = 0
 

Detailed Description

Fine-grained testing of Camera classes.

Function Documentation

static CamRes decRes ( const CamRes &  resCur)
static

Decrement resolution to the previous comman resolution.

Parameters
resCurCurrent resolution.
Returnsprevious lower resolution.

Definition at line 149 of file ut-Camera.cxx.

References rnr::CamRes1024x768, rnr::CamRes1440x1080, rnr::CamRes1600x1200, rnr::CamRes2048x1536, rnr::CamResQVGA, and rnr::CamResVGA.

Referenced by testCameraCv(), and testCameraGst().

150 {
151  CamRes resNew;
152 
153  switch( resCur.width )
154  {
155  case 2592:
156  resNew = CamRes2048x1536;
157  break;
158  case 2048:
159  resNew = CamRes1600x1200;
160  break;
161  case 1600:
162  resNew = CamRes1440x1080;
163  break;
164  case 1440:
165  resNew = CamRes1024x768;
166  break;
167  case 1024:
168  resNew = CamResVGA;
169  break;
170  case 640:
171  resNew = CamResQVGA;
172  break;
173  default:
174  resNew = resCur;
175  break;
176  }
177 
178  return resNew;
179 }
const CamRes CamRes1440x1080
1440 x 1080 resolution
Definition: Camera.h:93
const CamRes CamRes1600x1200
1600 x 1200 resolution
Definition: Camera.h:94
const CamRes CamRes1024x768
1024 x 768 resolution
Definition: Camera.h:92
const CamRes CamResQVGA
Quarter VGA 320 x 240 res.
Definition: Camera.h:90
const CamRes CamRes2048x1536
2048 x 1536 resolution
Definition: Camera.h:95
const CamRes CamResVGA
VGA 640 x 480 resolution.
Definition: Camera.h:91
gboolean GtkAlarm ( gpointer  user_data)

Timeout expiry callback.

The supplied user data is set to 1 (true).

Parameters
user_dataPointer to user supplied expiry flag.
Returns
Returns FALSE.

Definition at line 368 of file ut-Camera.cxx.

Referenced by GtkWaitKey().

369 {
370  *(int *)user_data = 1;
371  return FALSE;
372 }
gboolean GtkOnKeyPress ( GtkWidget *  w,
GdkEventKey *  event,
gpointer *  user_data 
)

Keyboard press event handler.

If registered, the application callback function will be called.

Parameters
wWidget where keyboard event occurred.
eventKeyboard event.
user_dataSupplied user data (this).
Returns
Returns FALSE.

Definition at line 421 of file ut-Camera.cxx.

Referenced by testCameraGst().

424 {
425  int code = 0;
426 
427  switch( event->keyval )
428  {
429  case GDK_Escape:
430  code = 27;
431  break;
432  case GDK_Return:
433  case GDK_Linefeed:
434  code = '\n';
435  break;
436  case GDK_Tab:
437  code = '\t';
438  break;
439  default:
440  code = event->keyval;
441  }
442 
443  GtkLastKey = (code & 0xffff) | (event->state << 16);
444 
445  return FALSE;
446 }
void GtkOnRealizeGstWin ( GtkWidget *  w,
gpointer  user_data 
)

Realize GStreamer video window callback.

Once the window has been realized, the X-Window id can be obtained. The id is critical for renders gst video and images to the gtk widget.

Parameters
wGtk draw widget where video will be overlaied.
user_dataSupplied user data (this).

Definition at line 339 of file ut-Camera.cxx.

Referenced by testCameraGst().

340 {
341 #if GTK_CHECK_VERSION(2,18,0)
342  //
343  // I copied this code. Kept it for meta-pedagogical reasons.
344  //
345  // This is here just for pedagogical purposes, GDK_WINDOW_XID will call
346  // it as well in newer Gtk versions.
347  //
348  if( !gdk_window_ensure_native(w->window) )
349  {
350  LOGERROR("Couldn't create native window needed for GstXOverlay!");
351  }
352 #endif
353 
354 #ifdef GDK_WINDOWING_X11
355  GstWinXid = GDK_WINDOW_XID(gtk_widget_get_window(w));
356 #endif
357 }
int GtkWaitKey ( int  delay)

Wait for keypress or timeout.

GTK widgets can be updated during this wait.

Parameters
delayTimeout delay in millseconds. Set to 0 for no timeout.
Returns
Returns code of last key pressed or -1 if timedout.

Definition at line 383 of file ut-Camera.cxx.

References GtkAlarm().

Referenced by testCameraGst().

384 {
385  int expired = 0;
386  guint timer = 0;
387  uint_t key;
388 
389  if( delay > 0 )
390  {
391  timer = g_timeout_add(delay, GtkAlarm, &expired);
392  }
393 
394  while( gtk_main_iteration_do(FALSE) &&
395  (GtkLastKey == 0) &&
396  !expired );
397 
398  if( delay > 0 && !expired )
399  {
400  g_source_remove(timer);
401  }
402 
403  key = GtkLastKey;
404 
405  GtkLastKey = 0;
406 
407  return key;
408 }
gboolean GtkAlarm(gpointer user_data)
Timeout expiry callback.
Definition: ut-Camera.cxx:368
static CamRes incRes ( const CamRes &  resCur)
static

Increment resolution to the next comman resolution.

Parameters
resCurCurrent resolution.
Returnsnext higher resolution.

Definition at line 110 of file ut-Camera.cxx.

References rnr::CamRes1024x768, rnr::CamRes1440x1080, rnr::CamRes1600x1200, rnr::CamRes2048x1536, rnr::CamRes2592x1944, and rnr::CamResVGA.

Referenced by testCameraCv(), and testCameraGst().

111 {
112  CamRes resNew;
113 
114  switch( resCur.width )
115  {
116  case 320:
117  resNew = CamResVGA;
118  break;
119  case 640:
120  resNew = CamRes1024x768;
121  break;
122  case 1024:
123  resNew = CamRes1440x1080;
124  break;
125  case 1440:
126  resNew = CamRes1600x1200;
127  break;
128  case 1600:
129  resNew = CamRes2048x1536;
130  break;
131  case 2048:
132  resNew = CamRes2592x1944;
133  break;
134  default:
135  resNew = resCur;
136  break;
137  }
138 
139  return resNew;
140 }
const CamRes CamRes1440x1080
1440 x 1080 resolution
Definition: Camera.h:93
const CamRes CamRes2592x1944
2592 x 1944 resolution
Definition: Camera.h:96
const CamRes CamRes1600x1200
1600 x 1200 resolution
Definition: Camera.h:94
const CamRes CamRes1024x768
1024 x 768 resolution
Definition: Camera.h:92
const CamRes CamRes2048x1536
2048 x 1536 resolution
Definition: Camera.h:95
const CamRes CamResVGA
VGA 640 x 480 resolution.
Definition: Camera.h:91
TEST ( Camera  ,
CameraCv   
)

Test OpenCv camera class.

The Test:
Construct CameraCv object.
run video.
take image.
change resolution.
Destroy CameraCv object.

Definition at line 690 of file ut-Camera.cxx.

References testCameraCv().

691 {
692  EXPECT_TRUE( testCameraCv() == 0 );
693 }
static int testCameraCv()
Test OpenCv CameraCv class.
Definition: ut-Camera.cxx:191
TEST ( Camera  ,
CameraGst   
)

Test OpenGst camera class.

The Test:
Construct CameraGst object.
run video.
take image.
change resolution.
overlay text.
Destroy CameraGst object.

Definition at line 706 of file ut-Camera.cxx.

References testCameraGst().

707 {
708  EXPECT_TRUE( testCameraGst() == 0 );
709 }
static int testCameraGst()
Test GStreamer CameraGst class.
Definition: ut-Camera.cxx:454
static int testCameraCv ( )
static

Test OpenCv CameraCv class.

Returns
Returns 0 if test succeeds, else returns < 0.

Definition at line 191 of file ut-Camera.cxx.

References rnr::CamResVGA, decRes(), incRes(), KEY_L_ALT, KEY_L_CTRL, KEY_L_SHIFT, KEY_R_ALT, KEY_R_CTRL, KEY_R_SHIFT, and TestMenu.

Referenced by TEST().

192 {
193  string strVideoWinName("ut-CameraCv - Video");
194  string strImageWinName("ut-CameraCv - Image");
195  CamRes resVideo = CamResVGA;
196  CamRes resImage = CamResVGA;
197  Mat frame;
198  Mat snapshot;
199  bool bRun = true;
200  int c;
201  int rc = 0;
202 
203  // manually set rnr log level
204  LOG_SET_THRESHOLD(LOG_LEVEL_DIAG3);
205 
206  CameraCv cam;
207 
208  if( cam.isFatal() )
209  {
210  return -1;
211  }
212 
213  printf("%s", TestMenu);
214 
215  namedWindow(strVideoWinName);
216 
217  while( bRun )
218  {
219  c = waitKey(10);
220 
221  // strip off shift bit
222  if( c != -1 )
223  {
224  c &= 0x00ff;
225  }
226 
227  switch( c )
228  {
229  case 'h':
230  printf("%s", TestMenu);
231  break;
232 
233  case 'q':
234  rc = 0;
235  bRun = false;
236  break;
237 
238  case 's':
239  if( cam.startVideo(resVideo) < 0 )
240  {
241  rc = -1;
242  bRun = false;
243  }
244  break;
245 
246  case 'p':
247  if( cam.stopVideo() < 0 )
248  {
249  rc = -1;
250  bRun = false;
251  }
252  break;
253 
254  case 'c':
255  if( cam.clickImage(snapshot, resImage) == OK )
256  {
257  namedWindow(strImageWinName);
258  imshow(strImageWinName, snapshot);
259  }
260  break;
261 
262  case '+':
263  resVideo = incRes(resVideo);
264  printf("%dx%d video resolution.\n", resVideo.width, resVideo.height);
265  if( cam.isCameraRunning() )
266  {
267  cam.startVideo(resVideo);
268  }
269  break;
270 
271  case '-':
272  resVideo = decRes(resVideo);
273  printf("%dx%d video resolution.\n", resVideo.width, resVideo.height);
274  if( cam.isCameraRunning() )
275  {
276  cam.startVideo(resVideo);
277  }
278  break;
279 
280  case '>':
281  resImage = incRes(resImage);
282  printf("%dx%d image resolution.\n", resImage.width, resImage.height);
283  break;
284 
285  case '<':
286  resImage = decRes(resImage);
287  printf("%dx%d image resolution.\n", resImage.width, resImage.height);
288  break;
289 
290  case -1:
291  if( cam.isCameraRunning() && !cam.isTakingAnImage() )
292  {
293  if( cam.grabFrame(frame) == OK )
294  {
295  imshow(strVideoWinName, frame);
296  }
297  }
298  break;
299 
300  case KEY_L_SHIFT:
301  case KEY_R_SHIFT:
302  case KEY_L_CTRL:
303  case KEY_R_CTRL:
304  case KEY_L_ALT:
305  case KEY_R_ALT:
306  break;
307 
308  default:
309  printf("0x%02x huh?\n", c);
310  break;
311  }
312  }
313 
314  destroyWindow(strVideoWinName);
315  destroyWindow(strImageWinName);
316 
317  LOG_SET_THRESHOLD(LOG_LEVEL_OFF);
318 
319  return rc;
320 }
#define KEY_L_SHIFT
left shift key code
Definition: ut-Camera.cxx:78
#define KEY_L_CTRL
left ctrl key code
Definition: ut-Camera.cxx:80
static CamRes incRes(const CamRes &resCur)
Increment resolution to the next comman resolution.
Definition: ut-Camera.cxx:110
static const char * TestMenu
Test menu.
Definition: ut-sm.cxx:102
#define KEY_R_SHIFT
right shift key code
Definition: ut-Camera.cxx:79
static CamRes decRes(const CamRes &resCur)
Decrement resolution to the previous comman resolution.
Definition: ut-Camera.cxx:149
#define KEY_R_CTRL
right ctrl key code
Definition: ut-Camera.cxx:81
#define KEY_L_ALT
left alt key code
Definition: ut-Camera.cxx:82
#define KEY_R_ALT
right alt key code
Definition: ut-Camera.cxx:83
const CamRes CamResVGA
VGA 640 x 480 resolution.
Definition: Camera.h:91
static int testCameraGst ( )
static

Test GStreamer CameraGst class.

Returns
Returns 0 if test succeeds, else returns < 0.

Definition at line 454 of file ut-Camera.cxx.

References rnr::CamResVGA, decRes(), GtkOnKeyPress(), GtkOnRealizeGstWin(), GtkWaitKey(), incRes(), KEY_L_ALT, KEY_L_CTRL, KEY_L_SHIFT, KEY_R_ALT, KEY_R_CTRL, KEY_R_SHIFT, and TestMenu.

Referenced by TEST().

455 {
456  static const char *TestMenuAddOn = " 't' text overlay\n";
457 
458  string strVideoWinName("ut-CameraGst - Video");
459  string strImageWinName("ut-CameraGst - Image");
460  CamRes resVideo = CamResVGA;
461  CamRes resImage = CamResVGA;
462  Mat frame;
463  Mat snapshot;
464 
465  GtkWidget *wMain;
466  GtkWindow *wWin;
467  GtkWidget *wGst;
468  gint nIdRealize;
469  gint nIdKeyPress;
470 
471  bool bRun = true;
472  bool bEnterText = false;
473  int c;
474  char bufText[256];
475  int n;
476  int rc = 0;
477 
478  // manually set rnr log level
479  LOG_SET_THRESHOLD(LOG_LEVEL_DIAG3);
480 
481  CameraGst cam;
482 
483  if( cam.isFatal() )
484  {
485  return -1;
486  }
487 
488  printf("%s", TestMenu);
489  printf("%s", TestMenuAddOn);
490 
491  gtk_init(0, NULL);
492 
493  //
494  // Create a new gtk window
495  //
496  wMain = gtk_window_new(GTK_WINDOW_TOPLEVEL);
497  wWin = GTK_WINDOW(wMain);
498 
499  //
500  // Configure window's look and feel
501  //
502  gtk_window_set_title(wWin, strVideoWinName.c_str());
503  gtk_window_resize(wWin, 640, 480);
504  gtk_window_set_decorated(wWin, TRUE);
505 
506  //---
507  // Video widget
508  //---
509  wGst = gtk_drawing_area_new();
510  g_object_set(G_OBJECT(wGst),
511  "width-request", 640,
512  "height-request", 480,
513  NULL);
514  nIdRealize = g_signal_connect(wGst, "realize",
515  G_CALLBACK(GtkOnRealizeGstWin), NULL);
516  gtk_widget_set_double_buffered(wGst, FALSE);
517  gtk_container_add(GTK_CONTAINER(wMain), wGst);
518 
519  //
520  // Event handlers
521  //
522  nIdKeyPress = gtk_signal_connect(GTK_OBJECT(wMain), "key-press-event",
523  GTK_SIGNAL_FUNC(GtkOnKeyPress), NULL);
524 
525  gtk_widget_show_all(wMain);
526 
527  cam.setXid(GstWinXid);
528 
529  while( bRun )
530  {
531  c = GtkWaitKey(30);
532 
533  // strip off shift bit
534  if( c != -1 )
535  {
536  c &= 0x00ff;
537  }
538 
539  if( bEnterText )
540  {
541  switch( c )
542  {
543  case '\n':
544  case '\r':
545  printf("\n");
546  fflush(stdout);
547  bufText[n] = 0;
548  if( n > 0 )
549  {
550  cam.setTextOverlay(bufText);
551  }
552  else
553  {
554  cam.clearTextOverlay();
555  }
556  bEnterText = false;
557  break;
558  default:
559  if( isprint(c) )
560  {
561  bufText[n++] = c;
562  printf("%c", c);
563  fflush(stdout);
564  }
565  break;
566  }
567  continue;
568  }
569 
570  switch( c )
571  {
572  case 'h':
573  printf("%s", TestMenu);
574  printf("%s", TestMenuAddOn);
575  break;
576 
577  case 'q':
578  rc = 0;
579  bRun = false;
580  break;
581 
582  case 's':
583  if( cam.startVideo(resVideo) < 0 )
584  {
585  rc = -1;
586  bRun = false;
587  }
588  break;
589 
590  case 'p':
591  if( cam.stopVideo() < 0 )
592  {
593  rc = -1;
594  bRun = false;
595  }
596  break;
597 
598  case 'c':
599  if( cam.clickImage(snapshot, resImage) == OK )
600  {
601  namedWindow(strImageWinName);
602  imshow(strImageWinName, snapshot);
603  }
604  break;
605 
606  case '+':
607  resVideo = incRes(resVideo);
608  printf("%dx%d video resolution.\n", resVideo.width, resVideo.height);
609  if( cam.isCameraRunning() )
610  {
611  cam.startVideo(resVideo);
612  }
613  break;
614 
615  case '-':
616  resVideo = decRes(resVideo);
617  printf("%dx%d video resolution.\n", resVideo.width, resVideo.height);
618  if( cam.isCameraRunning() )
619  {
620  cam.startVideo(resVideo);
621  }
622  break;
623 
624  case '>':
625  resImage = incRes(resImage);
626  printf("%dx%d image resolution.\n", resImage.width, resImage.height);
627  break;
628 
629  case '<':
630  resImage = decRes(resImage);
631  printf("%dx%d image resolution.\n", resImage.width, resImage.height);
632  break;
633 
634  case 't':
635  bEnterText = true;
636  n = 0;
637  printf("Text: ");
638  fflush(stdout);
639  break;
640 
641  case 0:
642  break;
643 
644  case KEY_L_SHIFT:
645  case KEY_R_SHIFT:
646  case KEY_L_CTRL:
647  case KEY_R_CTRL:
648  case KEY_L_ALT:
649  case KEY_R_ALT:
650  break;
651 
652  default:
653  printf("0x%02x huh?\n", c);
654  break;
655  }
656  }
657 
658  cam.stopVideo();
659 
660  //gtk_signal_disconnect(GTK_OBJECT(wMain), nIdRealize);
661  gtk_signal_disconnect(GTK_OBJECT(wMain), nIdKeyPress);
662  gtk_widget_destroy(wMain);
663  destroyWindow(strImageWinName);
664 
665  gtk_main_iteration_do(FALSE);
666 
667  while( gtk_events_pending() )
668  {
669  gtk_main_iteration_do(FALSE);
670  }
671 
672  LOG_SET_THRESHOLD(LOG_LEVEL_OFF);
673 
674  return rc;
675 }
gboolean GtkOnKeyPress(GtkWidget *w, GdkEventKey *event, gpointer *user_data)
Keyboard press event handler.
Definition: ut-Camera.cxx:421
#define KEY_L_SHIFT
left shift key code
Definition: ut-Camera.cxx:78
#define KEY_L_CTRL
left ctrl key code
Definition: ut-Camera.cxx:80
void GtkOnRealizeGstWin(GtkWidget *w, gpointer user_data)
Realize GStreamer video window callback.
Definition: ut-Camera.cxx:339
static CamRes incRes(const CamRes &resCur)
Increment resolution to the next comman resolution.
Definition: ut-Camera.cxx:110
int GtkWaitKey(int delay)
Wait for keypress or timeout.
Definition: ut-Camera.cxx:383
static const char * TestMenu
Test menu.
Definition: ut-sm.cxx:102
#define KEY_R_SHIFT
right shift key code
Definition: ut-Camera.cxx:79
static CamRes decRes(const CamRes &resCur)
Decrement resolution to the previous comman resolution.
Definition: ut-Camera.cxx:149
#define KEY_R_CTRL
right ctrl key code
Definition: ut-Camera.cxx:81
#define KEY_L_ALT
left alt key code
Definition: ut-Camera.cxx:82
#define KEY_R_ALT
right alt key code
Definition: ut-Camera.cxx:83
const CamRes CamResVGA
VGA 640 x 480 resolution.
Definition: Camera.h:91

Variable Documentation

const char* TestMenu
static
Initial value:
=
"\nTest Menu\n"
" 'h' print help\n"
" 'q' quit with success\n"
" 's' start video\n"
" 'p' stop video\n"
" 'c' click snapshot\n"
" '+/-' increase/decrease video resolution\n"
" '>/<' increase/decrease image resolution\n"

Definition at line 93 of file ut-Camera.cxx.