Subversion Repositories seema-scanner

Rev

Rev 1 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1 Rev 18
Line 30... Line 30...
30
    dc1394_free(context);
30
    dc1394_free(context);
31
    
31
    
32
    return ret;
32
    return ret;
33
}
33
}
34
 
34
 
35
CameraIIDC::CameraIIDC(unsigned int camID){
35
CameraIIDC::CameraIIDC(unsigned int camNum, CameraTriggerMode triggerMode) : Camera(triggerMode) {
36
 
36
 
37
    context = dc1394_new();
37
    context = dc1394_new();
38
    
38
    
39
    dc1394camera_list_t *camera_list;
39
    dc1394camera_list_t *camera_list;
40
    dc1394error_t err;
40
    dc1394error_t err;
41
    err = dc1394_camera_enumerate(context, &camera_list);
41
    err = dc1394_camera_enumerate(context, &camera_list);
42
    
42
    
43
    if(camID+1 > camera_list->num){
43
    if(camNum+1 > camera_list->num){
44
        cerr << "libdc1394: Selected camera is not available!";
44
        cerr << "libdc1394: Selected camera is not available!";
45
        return;
45
        return;
46
    }
46
    }
47
    
47
    
48
    cam = NULL;
48
    cam = NULL;
49
 
49
 
50
    cam = dc1394_camera_new(context, camera_list->ids[camID].guid);
50
    cam = dc1394_camera_new(context, camera_list->ids[camNum].guid);
51
    if(!cam){
51
    if(!cam){
52
        cerr << "libdc1394: Could not open camera!";
52
        cerr << "libdc1394: Could not open camera!";
53
        return;
53
        return;
54
    }
54
    }
55
 
55
 
56
    dc1394_camera_free_list(camera_list);
56
    dc1394_camera_free_list(camera_list);
57
 
57
 
58
    // Print camera information
-
 
59
    dc1394_camera_print_info(cam, stdout);
-
 
60
    fflush(stdout);
-
 
61
 
-
 
62
//    // Get video modes
58
//    // Get video modes
63
//    dc1394video_modes_t video_modes;
59
//    dc1394video_modes_t video_modes;
64
//    err=dc1394_video_get_supported_modes(cam, &video_modes);
60
//    err=dc1394_video_get_supported_modes(cam, &video_modes);
65
//    DC1394_WRN(err,"Can't get video modes");
61
//    DC1394_WRN(err,"Can't get video modes");
66
//    // Select highest res mode
62
//    // Select highest res mode
Line 82... Line 78...
82
//    }
78
//    }
83
 
79
 
84
    // Select format 7 mode 0
80
    // Select format 7 mode 0
85
    video_mode = DC1394_VIDEO_MODE_FORMAT7_0;
81
    video_mode = DC1394_VIDEO_MODE_FORMAT7_0;
86
 
82
 
87
    // Set video mode
83
    // Set bit depth
88
    err=dc1394_video_set_mode(cam, video_mode);
84
    err = dc1394_format7_set_color_coding(cam, video_mode, DC1394_COLOR_CODING_MONO16);
89
    if (err!=DC1394_SUCCESS)
85
    if (err!=DC1394_SUCCESS)
-
 
86
        cerr << "libdc1394: Could not set video mode or color coding!";
-
 
87
 
-
 
88
//    // Set video mode
-
 
89
//    err=dc1394_video_set_mode(cam, video_mode);
-
 
90
//    if (err!=DC1394_SUCCESS)
90
        cerr << "libdc1394: Could not set video mode!";
91
//        cerr << "libdc1394: Could not set video mode!";
91
 
92
 
92
    // Setup capture
93
    // Setup capture
93
    err=dc1394_video_set_operation_mode(cam, DC1394_OPERATION_MODE_1394B);
94
    err=dc1394_video_set_operation_mode(cam, DC1394_OPERATION_MODE_1394B);
94
    if (err!=DC1394_SUCCESS)
95
    if (err!=DC1394_SUCCESS)
95
        cerr << "libdc1394: Could not set operation mode!";
96
        cerr << "libdc1394: Could not set operation mode!";
Line 123... Line 124...
123
 
124
 
124
    // Set manual settings
125
    // Set manual settings
125
    dc1394_feature_set_mode(cam, DC1394_FEATURE_SHUTTER, DC1394_FEATURE_MODE_MANUAL);
126
    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
    dc1394_feature_set_mode(cam, DC1394_FEATURE_GAIN, DC1394_FEATURE_MODE_MANUAL);
127
 
128
 
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
 
129
 
133
    // Set reasonable default settings
130
    // Set reasonable default settings
134
    CameraSettings settings;
131
    CameraSettings settings;
135
    //settings.shutter = 8.333;
132
    //settings.shutter = 8.333;
136
    settings.shutter = 16.66;
133
    settings.shutter = 16.66;
Line 145... Line 142...
145
    fflush(stdout);
142
    fflush(stdout);
146
 
143
 
147
    return;
144
    return;
148
}
145
}
149
    
146
    
-
 
147
 
-
 
148
unsigned int getSetting(dc1394camera_t *cam, dc1394feature_t setting){
-
 
149
    dc1394error_t err;
-
 
150
    unsigned int value;
-
 
151
    err = dc1394_feature_get_value(cam, setting, &value);
-
 
152
    if(err != DC1394_SUCCESS)
-
 
153
        cerr << "Could not get setting!" << endl;
-
 
154
 
-
 
155
    return value;
-
 
156
}
-
 
157
 
-
 
158
CameraSettings CameraIIDC::getCameraSettings(){
-
 
159
 
-
 
160
    // Get settings:
-
 
161
    CameraSettings settings;
-
 
162
    settings.gain = getSetting(cam, DC1394_FEATURE_GAIN);
-
 
163
    settings.shutter = getSetting(cam, DC1394_FEATURE_SHUTTER);
-
 
164
 
-
 
165
    return settings;
-
 
166
}
-
 
167
 
-
 
168
void setSetting(dc1394camera_t *cam, dc1394feature_t setting, float value){
-
 
169
    dc1394error_t err;
-
 
170
    float min, max;
-
 
171
    dc1394_feature_get_absolute_boundaries(cam, setting, &min, &max);
-
 
172
    if(value < min || value > max){
-
 
173
        std::cerr << "CameraIIDC: cannot set value. Out of permissable range." << std::endl;
-
 
174
    } else {
-
 
175
        err = dc1394_feature_set_absolute_control(cam, setting, DC1394_ON);
-
 
176
        if(err != DC1394_SUCCESS)
-
 
177
            cerr << "Could not enable absolute control!" << endl;
-
 
178
        err = dc1394_feature_set_absolute_value(cam, setting, value);
-
 
179
        if(err != DC1394_SUCCESS)
-
 
180
            cerr << "Could not set absolute value!" << endl;
-
 
181
    }
-
 
182
}
-
 
183
 
-
 
184
void CameraIIDC::setCameraSettings(CameraSettings settings){
-
 
185
 
-
 
186
    // Set settings:
-
 
187
    setSetting(cam, DC1394_FEATURE_GAIN, settings.gain);
-
 
188
    setSetting(cam, DC1394_FEATURE_SHUTTER, settings.shutter/1000.0); // [ms]
-
 
189
}
-
 
190
 
-
 
191
 
150
void CameraIIDC::startCapture(){
192
void CameraIIDC::startCapture(){
151
 
193
 
152
    dc1394error_t err;
194
    dc1394error_t err;
153
 
195
 
154
    // Set hardware trigger
196
    // Print camera information
155
    err=dc1394_external_trigger_set_power(cam, DC1394_ON);
197
    dc1394_camera_print_info(cam, stdout);
156
    if (err!=DC1394_SUCCESS)
198
    fflush(stdout);
157
        cerr << "libdc1394: Could not set external trigger on!";
-
 
158
 
199
 
159
    err=dc1394_external_trigger_set_source(cam, DC1394_TRIGGER_SOURCE_0);
-
 
160
    if (err!=DC1394_SUCCESS)
200
    if(triggerMode == triggerModeHardware){
161
        cerr << "libdc1394: Could not set external trigger source!";
-
 
162
 
201
 
-
 
202
        // Set hardware trigger
-
 
203
        err=dc1394_external_trigger_set_power(cam, DC1394_ON);
-
 
204
        if (err!=DC1394_SUCCESS)
-
 
205
            cerr << "libdc1394: Could not set external trigger on!";
-
 
206
 
-
 
207
        err=dc1394_external_trigger_set_source(cam, DC1394_TRIGGER_SOURCE_0);
-
 
208
        if (err!=DC1394_SUCCESS)
-
 
209
            cerr << "libdc1394: Could not set external trigger source!";
-
 
210
 
163
    err=dc1394_external_trigger_set_mode(cam, DC1394_TRIGGER_MODE_14);
211
        err=dc1394_external_trigger_set_mode(cam, DC1394_TRIGGER_MODE_14);
164
    if (err!=DC1394_SUCCESS)
212
        if (err!=DC1394_SUCCESS)
165
        cerr << "libdc1394: Could not set external trigger mode!";
213
            cerr << "libdc1394: Could not set external trigger mode!";
-
 
214
 
-
 
215
        err=dc1394_external_trigger_set_polarity(cam, DC1394_TRIGGER_ACTIVE_HIGH);
-
 
216
        if (err!=DC1394_SUCCESS)
-
 
217
            cerr << "libdc1394: Could not set external trigger polarity!";
-
 
218
 
-
 
219
    } else if(triggerMode == triggerModeSoftware) {
-
 
220
 
-
 
221
        // Disable hardware trigger
-
 
222
        err=dc1394_external_trigger_set_power(cam, DC1394_OFF);
-
 
223
        if (err!=DC1394_SUCCESS)
-
 
224
            cerr << "libdc1394: Could not set external trigger off!";
166
 
225
 
167
    err=dc1394_external_trigger_set_polarity(cam, DC1394_TRIGGER_ACTIVE_HIGH);
-
 
168
    if (err!=DC1394_SUCCESS)
226
    }
169
        cerr << "libdc1394: Could not set external trigger polarity!";
-
 
170
 
227
 
171
    // Begin transmission
228
    // Begin transmission
172
	err = dc1394_video_set_transmission(cam, DC1394_ON);
229
	err = dc1394_video_set_transmission(cam, DC1394_ON);
173
	if (err!=DC1394_SUCCESS)
230
	if (err!=DC1394_SUCCESS)
174
	{
231
	{
Line 183... Line 240...
183
    dc1394error_t err;
240
    dc1394error_t err;
184
 
241
 
185
    err = dc1394_video_set_transmission(cam, DC1394_OFF);
242
    err = dc1394_video_set_transmission(cam, DC1394_OFF);
186
    err = dc1394_capture_stop(cam);
243
    err = dc1394_capture_stop(cam);
187
 
244
 
188
    // Disable trigger
245
//    // Disable trigger
189
    err=dc1394_external_trigger_set_power(cam, DC1394_OFF);
246
//    err=dc1394_external_trigger_set_power(cam, DC1394_OFF);
190
    if (err!=DC1394_SUCCESS)
247
//    if (err!=DC1394_SUCCESS)
191
        cerr << "libdc1394: Could not set external trigger on!";
248
//        cerr << "libdc1394: Could not set external trigger on!";
192
 
249
 
193
    capturing = false;
250
    capturing = false;
194
}
251
}
195
 
252
 
196
CameraFrame CameraIIDC::lockFrame(){
253
CameraFrame CameraIIDC::getFrame(){
197
 
254
 
198
    CameraFrame frame;
255
    CameraFrame frame;
199
 
256
 
200
    if (!capturing) {
257
    if (!capturing) {
201
        cerr << "ERROR: Not capturing on camera. Call startCapture() before lockFrame()." << endl;
258
        cerr << "ERROR: Not capturing on camera. Call startCapture() before lockFrame()." << endl;
202
        return frame;
259
        return frame;
203
    }
260
    }
204
 
261
 
205
    dc1394error_t err;
262
    dc1394error_t err;
206
    
263
    
-
 
264
    if(triggerMode == triggerModeSoftware){
-
 
265
 
-
 
266
        if (cam->one_shot_capable != DC1394_TRUE){
-
 
267
            cerr << "ERROR: Camera is not one_shot_capable." << endl;
-
 
268
            return frame;
-
 
269
        }
-
 
270
 
-
 
271
        dc1394error_t err;
-
 
272
 
-
 
273
        // Flush the ring buffer
-
 
274
        flushBuffer();
-
 
275
 
-
 
276
        // One-shot trigger
-
 
277
        err == dc1394_video_set_one_shot(cam, DC1394_ON);
-
 
278
 
-
 
279
    }
-
 
280
 
207
	// Get frame from ring buffer:
281
    // Get frame from ring buffer:
208
    err = dc1394_capture_dequeue(cam, DC1394_CAPTURE_POLICY_WAIT, &currentFrame);
282
    err = dc1394_capture_dequeue(cam, DC1394_CAPTURE_POLICY_WAIT, &currentFrame);
209
    if (err!=DC1394_SUCCESS){
283
    if (err!=DC1394_SUCCESS){
210
        cerr << "ERROR: Could not capture a frame." << endl;
284
        cerr << "ERROR: Could not capture a frame." << endl;
211
        return frame;
285
        return frame;
-
 
286
    }
212
	}
287
 
-
 
288
    // Return the frame to the ring buffer:
-
 
289
    dc1394_capture_enqueue(cam, currentFrame);
-
 
290
    currentFrame = NULL;
213
    
291
 
214
    // Copy frame address and properties
292
    // Copy frame address and properties
215
    frame.memory = currentFrame->image;
293
    frame.memory = (unsigned short*)currentFrame->image;
216
    frame.width = currentFrame->size[0];
294
    frame.width = currentFrame->size[0];
217
    frame.height = currentFrame->size[1];
295
    frame.height = currentFrame->size[1];
-
 
296
    frame.bitDepth = 16;
218
    frame.sizeBytes = currentFrame->image_bytes;
297
    frame.sizeBytes = currentFrame->image_bytes;
219
 
298
 
220
    return frame;
299
    return frame;
221
}
300
}
222
 
301
 
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(){
302
void CameraIIDC::flushBuffer(){
236
    // This function is courtesy of ofxVideoGrabber/Libdc1394Grabber
303
    // This function is courtesy of ofxVideoGrabber/Libdc1394Grabber
237
    bool bufferEmpty = false;
304
    bool bufferEmpty = false;
238
 
305
 
239
    while (!bufferEmpty){
306
    while (!bufferEmpty){
Line 247... Line 314...
247
            bufferEmpty = true;
314
            bufferEmpty = true;
248
        }
315
        }
249
    }
316
    }
250
}
317
}
251
 
318
 
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
 
319
 
292
size_t CameraIIDC::getFrameSizeBytes(){
320
size_t CameraIIDC::getFrameSizeBytes(){
293
    if (!capturing) {
321
    if (!capturing) {
294
        cerr << "ERROR: Cannot get frame size before capturing. Call startCapture() before getFrameSizeBytes()." << endl;
322
        cerr << "ERROR: Cannot get frame size before capturing. Call startCapture() before getFrameSizeBytes()." << endl;
295
        return 0;
323
        return 0;
Line 307... Line 335...
307
    dc1394_format7_get_total_bytes(cam, video_mode, &total_bytes);
335
    dc1394_format7_get_total_bytes(cam, video_mode, &total_bytes);
308
 
336
 
309
    return total_bytes;
337
    return total_bytes;
310
}
338
}
311
 
339
 
312
void CameraIIDC::getFrameWidthHeight(unsigned int *width, unsigned int *height){
340
size_t CameraIIDC::getFrameWidth(){
313
    uint32_t _width, _height;
341
    uint32_t _width, _height;
314
    dc1394_get_image_size_from_video_mode(cam, video_mode, &_width, &_height);
342
    dc1394_get_image_size_from_video_mode(cam, video_mode, &_width, &_height);
315
    *width = _width;
343
    return _width;
316
    *height = _height;
-
 
317
}
344
}
318
 
345
 
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
 
346
 
342
unsigned int getSetting(dc1394camera_t *cam, dc1394feature_t setting){
347
size_t CameraIIDC::getFrameHeight(){
343
    dc1394error_t err;
-
 
344
    unsigned int value;
348
    uint32_t _width, _height;
345
    err = dc1394_feature_get_value(cam, setting, &value);
349
    dc1394_get_image_size_from_video_mode(cam, video_mode, &_width, &_height);
346
    if(err != DC1394_SUCCESS)
-
 
347
        cerr << "Could not get setting!" << endl;
-
 
348
    
-
 
349
    return value;
350
    return _height;
350
}
351
}
351
 
352
 
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
 
353
 
362
CameraIIDC::~CameraIIDC(){
354
CameraIIDC::~CameraIIDC(){
363
    // Stop camera transmission
355
    // Stop camera transmission
364
    if(capturing)
356
    if(capturing)
365
        stopCapture();
357
        stopCapture();