Subversion Repositories seema-scanner

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 jakw 1
#include "CameraIIDC.h"
2
#include <cstring>
3
 
4
vector<CameraInfo> CameraIIDC::getCameraList(){
5
 
6
    dc1394_t *context = dc1394_new();
7
 
8
    dc1394camera_list_t *camera_list;
9
    dc1394error_t err;
10
    err = dc1394_camera_enumerate(context, &camera_list);
11
    DC1394_WRN(err,"libdc1394: Failed to enumerate cameras!");
12
 
13
    vector<CameraInfo> ret;
14
 
15
    for (unsigned int i=0; i<camera_list->num; i++) {
16
        CameraInfo info;
17
        dc1394camera_t *cam;
18
        cam = dc1394_camera_new(context, camera_list->ids[i].guid);
19
 
20
        //info.vendor = std::string(cam->vendor ? cam->vendor : "");
21
        info.vendor = "IIDC";
22
        info.model = string(cam->model ? cam->model : "");
23
        info.busID = (unsigned int)cam->guid;
24
 
25
        dc1394_camera_free(cam);
26
        ret.push_back(info);
27
    }
28
 
29
    dc1394_camera_free_list(camera_list);
30
    dc1394_free(context);
31
 
32
    return ret;
33
}
34
 
35
CameraIIDC::CameraIIDC(unsigned int camID){
36
 
37
    context = dc1394_new();
38
 
39
    dc1394camera_list_t *camera_list;
40
    dc1394error_t err;
41
    err = dc1394_camera_enumerate(context, &camera_list);
42
 
43
    if(camID+1 > camera_list->num){
44
        cerr << "libdc1394: Selected camera is not available!";
45
        return;
46
    }
47
 
48
    cam = NULL;
49
 
50
    cam = dc1394_camera_new(context, camera_list->ids[camID].guid);
51
    if(!cam){
52
        cerr << "libdc1394: Could not open camera!";
53
        return;
54
    }
55
 
56
    dc1394_camera_free_list(camera_list);
57
 
58
    // Print camera information
59
    dc1394_camera_print_info(cam, stdout);
60
    fflush(stdout);
61
 
62
//    // Get video modes
63
//    dc1394video_modes_t video_modes;
64
//    err=dc1394_video_get_supported_modes(cam, &video_modes);
65
//    DC1394_WRN(err,"Can't get video modes");
66
//    // Select highest res mode
67
//    int i;
68
//    dc1394color_coding_t coding;
69
//    for (i=video_modes.num-1;i>=0;i--) {
70
//        if (!dc1394_is_video_mode_scalable(video_modes.modes[i])) {
71
//            dc1394_get_color_coding_from_video_mode(cam, video_modes.modes[i], &coding);
72
//            DC1394_WRN(err,"libdc1394: Could not get color coding");
73
//            if (coding==DC1394_COLOR_CODING_MONO8) {
74
//                video_mode=video_modes.modes[i];
75
//                break;
76
//            }
77
//        }
78
//    }
79
//    if (i < 0) {
80
//        cerr << "libdc1394: Could not get a valid gray scale mode!";
81
//        return;
82
//    }
83
 
84
    // Select format 7 mode 0
85
    video_mode = DC1394_VIDEO_MODE_FORMAT7_0;
86
 
87
    // Set video mode
88
    err=dc1394_video_set_mode(cam, video_mode);
89
    if (err!=DC1394_SUCCESS)
90
        cerr << "libdc1394: Could not set video mode!";
91
 
92
    // Setup capture
93
    err=dc1394_video_set_operation_mode(cam, DC1394_OPERATION_MODE_1394B);
94
    if (err!=DC1394_SUCCESS)
95
        cerr << "libdc1394: Could not set operation mode!";
96
 
97
    err=dc1394_video_set_iso_speed(cam, DC1394_ISO_SPEED_800);
98
    if (err!=DC1394_SUCCESS)
99
        cerr << "libdc1394: Could not set iso speed!";
100
 
101
    // Size of ringbuffer (Note: on OS X 10.9, size must be greater than 1)
102
#ifdef __APPLE__
103
    unsigned int bufferSize = 2;
104
#else
105
    unsigned int bufferSize = 1;
106
#endif
107
 
108
    err=dc1394_capture_setup(cam, bufferSize, DC1394_CAPTURE_FLAGS_DEFAULT);
109
    if (err!=DC1394_SUCCESS)
110
        cerr << "libdc1394: Could not set up camera!";
111
 
112
    // Disable auto exposure mode
113
    dc1394_feature_set_power(cam, DC1394_FEATURE_EXPOSURE, DC1394_OFF);
114
 
115
    // Disable gamma mode
116
    dc1394_feature_set_power(cam, DC1394_FEATURE_GAMMA, DC1394_OFF);
117
 
118
    // Disable sharpness mode
119
    dc1394_feature_set_power(cam, DC1394_FEATURE_SHARPNESS, DC1394_OFF);
120
 
121
    // Disable frame-rate mode
122
    dc1394_feature_set_power(cam, DC1394_FEATURE_FRAME_RATE, DC1394_OFF);
123
 
124
    // Set manual settings
125
    dc1394_feature_set_mode(cam, DC1394_FEATURE_SHUTTER, DC1394_FEATURE_MODE_MANUAL);
126
    dc1394_feature_set_mode(cam, DC1394_FEATURE_GAIN, DC1394_FEATURE_MODE_MANUAL);
127
 
128
    // Disable trigger
129
    err=dc1394_external_trigger_set_power(cam, DC1394_OFF);
130
    if (err!=DC1394_SUCCESS)
131
        cerr << "libdc1394: Could not set external trigger on!";
132
 
133
    // Set reasonable default settings
134
    CameraSettings settings;
135
    //settings.shutter = 8.333;
136
    settings.shutter = 16.66;
137
    settings.gain = 0.0;
138
    this->setCameraSettings(settings);
139
 
140
    // Print camera features and settings
141
    dc1394featureset_t features;
142
    err=dc1394_feature_get_all(cam, &features);
143
    DC1394_WRN(err, "libdc1394: Could not get feature set.");
144
    dc1394_feature_print_all(&features, stdout);
145
    fflush(stdout);
146
 
147
    return;
148
}
149
 
150
void CameraIIDC::startCapture(){
151
 
152
    dc1394error_t err;
153
 
154
    // Set hardware trigger
155
    err=dc1394_external_trigger_set_power(cam, DC1394_ON);
156
    if (err!=DC1394_SUCCESS)
157
        cerr << "libdc1394: Could not set external trigger on!";
158
 
159
    err=dc1394_external_trigger_set_source(cam, DC1394_TRIGGER_SOURCE_0);
160
    if (err!=DC1394_SUCCESS)
161
        cerr << "libdc1394: Could not set external trigger source!";
162
 
163
    err=dc1394_external_trigger_set_mode(cam, DC1394_TRIGGER_MODE_14);
164
    if (err!=DC1394_SUCCESS)
165
        cerr << "libdc1394: Could not set external trigger mode!";
166
 
167
    err=dc1394_external_trigger_set_polarity(cam, DC1394_TRIGGER_ACTIVE_HIGH);
168
    if (err!=DC1394_SUCCESS)
169
        cerr << "libdc1394: Could not set external trigger polarity!";
170
 
171
    // Begin transmission
172
	err = dc1394_video_set_transmission(cam, DC1394_ON);
173
	if (err!=DC1394_SUCCESS)
174
	{
175
		cerr << "ERROR: Could not begin transmission!" << endl;
176
	}    
177
 
178
    capturing = true;
179
}
180
 
181
void CameraIIDC::stopCapture(){
182
 
183
    dc1394error_t err;
184
 
185
    err = dc1394_video_set_transmission(cam, DC1394_OFF);
186
    err = dc1394_capture_stop(cam);
187
 
188
    // Disable trigger
189
    err=dc1394_external_trigger_set_power(cam, DC1394_OFF);
190
    if (err!=DC1394_SUCCESS)
191
        cerr << "libdc1394: Could not set external trigger on!";
192
 
193
    capturing = false;
194
}
195
 
196
CameraFrame CameraIIDC::lockFrame(){
197
 
198
    CameraFrame frame;
199
 
200
    if (!capturing) {
201
        cerr << "ERROR: Not capturing on camera. Call startCapture() before lockFrame()." << endl;
202
        return frame;
203
    }
204
 
205
    dc1394error_t err;
206
 
207
	// Get frame from ring buffer:
208
    err = dc1394_capture_dequeue(cam, DC1394_CAPTURE_POLICY_WAIT, &currentFrame);
209
    if (err!=DC1394_SUCCESS){
210
        cerr << "ERROR: Could not capture a frame." << endl;
211
        return frame;
212
	}
213
 
214
    // Copy frame address and properties
215
    frame.memory = currentFrame->image;
216
    frame.width = currentFrame->size[0];
217
    frame.height = currentFrame->size[1];
218
    frame.sizeBytes = currentFrame->image_bytes;
219
 
220
    return frame;
221
}
222
 
223
void CameraIIDC::unlockFrame(){
224
 
225
    if (currentFrame == NULL){
226
        cerr << "ERROR: No frame locked. Call lockFrame() before unlockFrame()." << endl;
227
        return;
228
    }
229
 
230
    // Return the frame to the ring buffer:
231
    dc1394_capture_enqueue(cam, currentFrame);
232
    currentFrame = NULL;
233
}
234
 
235
void CameraIIDC::flushBuffer(){
236
    // This function is courtesy of ofxVideoGrabber/Libdc1394Grabber
237
    bool bufferEmpty = false;
238
 
239
    while (!bufferEmpty){
240
        if(dc1394_capture_dequeue(cam, DC1394_CAPTURE_POLICY_POLL, &currentFrame) == DC1394_SUCCESS){
241
            if(currentFrame != NULL){
242
                dc1394_capture_enqueue(cam, currentFrame);
243
            } else {
244
                bufferEmpty = true;
245
            }
246
        } else {
247
            bufferEmpty = true;
248
        }
249
    }
250
}
251
 
252
CameraFrame CameraIIDC::getSingleFrame(){
253
 
254
    CameraFrame frame;
255
 
256
    if (capturing) {
257
        cerr << "ERROR: Capturing on camera. Call stopCapture() before getSingleFrame()." << endl;
258
        return frame;
259
    }
260
 
261
    if (cam->one_shot_capable != DC1394_TRUE){
262
        cerr << "ERROR: Camera is not one_shot_capable." << endl;
263
        return frame;
264
    }
265
 
266
    dc1394error_t err;
267
 
268
    // Flush the ring buffer
269
    flushBuffer();
270
 
271
    // One-shot trigger
272
    dc1394_video_set_one_shot(cam, DC1394_ON);
273
 
274
    // Dequeue frame
275
    err = dc1394_capture_dequeue(cam, DC1394_CAPTURE_POLICY_WAIT, &currentFrame);
276
    if (err!=DC1394_SUCCESS){
277
        cerr << "ERROR: Could not capture a frame." << endl;
278
        return frame;
279
    }
280
 
281
    // Copy frame address and properties
282
    frame.memory = currentFrame->image;
283
    frame.width = currentFrame->size[0];
284
    frame.height = currentFrame->size[1];
285
    frame.sizeBytes = currentFrame->image_bytes;
286
 
287
    return frame;
288
 
289
}
290
 
291
 
292
size_t CameraIIDC::getFrameSizeBytes(){
293
    if (!capturing) {
294
        cerr << "ERROR: Cannot get frame size before capturing. Call startCapture() before getFrameSizeBytes()." << endl;
295
        return 0;
296
    }
297
 
298
//    dc1394video_frame_t *frame = NULL;
299
//    dc1394error_t err;
300
 
301
//	// Get frame from ring buffer:
302
//    err = dc1394_capture_dequeue(cam, DC1394_CAPTURE_POLICY_WAIT, &frame);
303
//    err = dc1394_capture_enqueue(cam, frame);
304
 
305
//    return frame->image_bytes;
306
    uint64_t total_bytes;
307
    dc1394_format7_get_total_bytes(cam, video_mode, &total_bytes);
308
 
309
    return total_bytes;
310
}
311
 
312
void CameraIIDC::getFrameWidthHeight(unsigned int *width, unsigned int *height){
313
    uint32_t _width, _height;
314
    dc1394_get_image_size_from_video_mode(cam, video_mode, &_width, &_height);
315
    *width = _width;
316
    *height = _height;
317
}
318
 
319
void setSetting(dc1394camera_t *cam, dc1394feature_t setting, float value){
320
    dc1394error_t err;
321
    float min, max;
322
    dc1394_feature_get_absolute_boundaries(cam, setting, &min, &max);
323
    if(value < min || value > max){
324
        std::cerr << "CameraIIDC: cannot set value. Out of permissable range." << std::endl;
325
    } else {
326
        err = dc1394_feature_set_absolute_control(cam, setting, DC1394_ON);
327
        if(err != DC1394_SUCCESS)
328
            cerr << "Could not enable absolute control!" << endl;
329
        err = dc1394_feature_set_absolute_value(cam, setting, value);
330
        if(err != DC1394_SUCCESS)
331
            cerr << "Could not set absolute value!" << endl;
332
    }
333
}
334
 
335
void CameraIIDC::setCameraSettings(CameraSettings settings){
336
 
337
	// Set settings:
338
    setSetting(cam, DC1394_FEATURE_GAIN, settings.gain);
339
    setSetting(cam, DC1394_FEATURE_SHUTTER, settings.shutter/1000.0); // [ms]
340
}
341
 
342
unsigned int getSetting(dc1394camera_t *cam, dc1394feature_t setting){
343
    dc1394error_t err;
344
    unsigned int value;
345
    err = dc1394_feature_get_value(cam, setting, &value);
346
    if(err != DC1394_SUCCESS)
347
        cerr << "Could not get setting!" << endl;
348
 
349
    return value;
350
}
351
 
352
CameraSettings CameraIIDC::getCameraSettings(){
353
 
354
	// Get settings:
355
    CameraSettings settings;
356
    settings.gain = getSetting(cam, DC1394_FEATURE_GAIN);
357
	settings.shutter = getSetting(cam, DC1394_FEATURE_SHUTTER);
358
 
359
    return settings;
360
}
361
 
362
CameraIIDC::~CameraIIDC(){
363
    // Stop camera transmission
364
    if(capturing)
365
        stopCapture();
366
    else
367
        dc1394_capture_stop(cam);
368
 
369
    // Gracefulle destruct the camera
370
    dc1394_camera_free(cam);
371
    dc1394_free(context);
372
}
373
 
374
 
375