-
Notifications
You must be signed in to change notification settings - Fork 3
/
fab_snap.pro
98 lines (90 loc) · 2.52 KB
/
fab_snap.pro
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
;+
; NAME:
; fab_snap
;
; PURPOSE:
; Acquire video image for analysis from the FAB camera subsystem
; while optionally displaying intermediate images
;
; USAGE:
; a = fab_snap([s])
;
; OPTIONAL INPUTS:
; s: pointer to the fabstate structure of a running fab instance.
; If not provided, this will be obtained by calling GETFAB.
;
; OUTPUTS:
; a: Current image from the video camera controlled by FAB.
; If fab is not running, or is otherwise inaccessible,
; fab_snap returns 0.
;
; KEYWORDS:
; DELAY: delay time, in seconds, before an image should be
; returned. System continues to acquire and display images
; during this interval, although no GUI interaction is
; possible. Returns last acquired image.
;
; MAX: return an image composed of the brightest pixels in a
; specified number of frames. May be combined with DELAY.
;
; MEAN: return an image composed of the average of the specified
; number of frames. May be combined with DELAY
;
; GRAYSCALE: return a grayscale image, even if the camera is taking
; color pictures.
;
; MODIFICATION HISTORY
; 02/05/2011 Written by David G. Grier, New York University
; 02/16/2011 DGG reset camera for better synchronization.
; 10/04/2011 DGG use GETFAB to obtain fabstate if not provided.
; Added GRAYSCALE keyword.
; Documentation updates.
;
; Copyright (c) 2011, David G. Grier
;-
function fab_snap, s, $
delay = delay, $
max = max, $
mean = mean, $
grayscale = grayscale
COMPILE_OPT IDL2
if n_params() eq 0 then begin
s = getfab()
if ~isa(*s, 'fabstate') then $
return, 0
endif
;(*s).o.camera.reset
a = (*s).o.camera.snap()
(*s).o.screen.draw
if keyword_set(delay) then begin
nframes = delay / (*s).timer
for i = 1, nframes - 1 do begin
wait, (*s).timer
a = (*s).o.camera.snap()
(*s).o.screen.draw
endfor
endif
if keyword_set(max) then begin
for i = 1, max-1 do begin
wait, (*s).timer
a = a > (*s).o.camera.snap()
(*s).o.screen.draw
endfor
endif
if keyword_set(mean) then begin
for i = 1, mean-1 do begin
wait, (*s).timer
a += float((*s).o.camera.snap())
(*s).o.screen.draw
endfor
a = byte(a/mean)
endif
if keyword_set(grayscale) then begin
if size(a, /n_dimensions) eq 3 then begin
dim = size(a, /dimensions)
ndx = where(dim eq 3) + 1
a = byte(mean(a, dimension = ndx)) ; FIXME proper RGB weighting
endif
endif
return, a
end