Subversion Repositories seema-scanner

Rev

Rev 1 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 jakw 1
#include "CameraXIMEA.h"
2
#include <cstdio>
3
 
18 jakw 4
// Note: library headers conflict with IDS imaging headers
1 jakw 5
#include <xiApi.h>
6
 
18 jakw 7
#define HandleResult(res,place) if (res!=XI_OK) {printf("CameraXIMEA: Error at %s (%d)\n",place,res); fflush(stdout);}
1 jakw 8
 
9
std::vector<CameraInfo> CameraXIMEA::getCameraList(){
10
 
11
    XI_RETURN stat = XI_OK;
12
    DWORD numCams;
13
    stat = xiGetNumberDevices(&numCams);
14
    HandleResult(stat, "xiGetNumberDevices");
15
 
16
    std::vector<CameraInfo> ret(numCams);
17
    for(unsigned int i=0; i<numCams; i++){
18
        CameraInfo info;
19
        info.vendor = "Ximea";
20
        char name[20];
21
        xiGetDeviceInfoString(i, XI_PRM_DEVICE_NAME, name, 20);
22
        info.model = name;
23
        info.busID = i;
24
        ret[i] = info;
25
    }
26
    return ret;
27
}
28
 
18 jakw 29
CameraXIMEA::CameraXIMEA(unsigned int camNum, CameraTriggerMode triggerMode) : Camera(triggerMode), camera(NULL){
1 jakw 30
 
31
    // Set debugging level
32
    xiSetParamInt(0, XI_PRM_DEBUG_LEVEL, XI_DL_FATAL);
33
 
18 jakw 34
    // Disable auto bandwidth determination (takes some seconds in initialization)
35
    xiSetParamInt(0, XI_PRM_AUTO_BANDWIDTH_CALCULATION, XI_OFF);
1 jakw 36
 
37
    // Retrieve a handle to the camera device
38
    stat = xiOpenDevice(camNum, &camera);
39
    HandleResult(stat,"xiOpenDevice");
40
 
18 jakw 41
    // Configure unsafe buffers (prevents old buffers, memory leak)
42
    xiSetParamInt(camera, XI_PRM_BUFFER_POLICY, XI_BP_UNSAFE);
1 jakw 43
 
44
//    // Output frame signal
45
//    xiSetParamInt(camera, XI_PRM_GPO_SELECTOR, 1);
46
//    xiSetParamInt(camera, XI_PRM_GPO_MODE, XI_GPO_ON);
47
 
48
    // Configure buffer size
18 jakw 49
//    stat = xiSetParamInt(camera, XI_PRM_ACQ_BUFFER_SIZE, 128*1024);
50
//    HandleResult(stat,"xiSetParam (XI_PRM_ACQ_BUFFER_SIZE)");
51
//    stat = xiSetParamInt(camera, XI_PRM_BUFFERS_QUEUE_SIZE, 10);
52
//    HandleResult(stat,"xiSetParam (XI_PRM_BUFFERS_QUEUE_SIZE)");
1 jakw 53
 
54
    // Configure queue mode (0 = next frame in queue, 1 = most recent frame)
18 jakw 55
    stat = xiSetParamInt(camera, XI_PRM_RECENT_FRAME, 0);
1 jakw 56
    HandleResult(stat,"xiSetParam (XI_PRM_RECENT_FRAME)");
57
 
58
    // Configure image type
18 jakw 59
    stat = xiSetParamInt(camera, XI_PRM_IMAGE_DATA_FORMAT, XI_MONO16);
1 jakw 60
    HandleResult(stat,"xiSetParam (XI_PRM_IMAGE_DATA_FORMAT)");
61
 
18 jakw 62
    // Configure input pin 1 as trigger input
1 jakw 63
    xiSetParamInt(camera, XI_PRM_GPI_SELECTOR, 1);
64
    stat = xiSetParamInt(camera, XI_PRM_GPI_MODE, XI_GPI_TRIGGER);
65
    HandleResult(stat,"xiSetParam (XI_PRM_GPI_MODE)");
66
 
67
//    // Downsample to half size
18 jakw 68
//    stat = xiSetParamInt(camera, XI_PRM_DOWNSAMPLING_TYPE, XI_SKIPPING);
1 jakw 69
//    HandleResult(stat,"xiSetParam (XI_PRM_DOWNSAMPLING_TYPE)");
70
//    stat = xiSetParamInt(camera, XI_PRM_DOWNSAMPLING, 2);
71
//    HandleResult(stat,"xiSetParam (XI_PRM_DOWNSAMPLING)");
72
 
73
//    // Configure frame rate
74
//    stat = xiSetParamFloat(camera, XI_PRM_FRAMERATE, 10);
75
//    HandleResult(stat,"xiSetParam (XI_PRM_FRAMERATE)");
76
 
77
    // Define ROI
78
    stat = xiSetParamInt(camera, XI_PRM_WIDTH, 640);
79
    HandleResult(stat,"xiSetParam (XI_PRM_WIDTH)");
80
    stat = xiSetParamInt(camera, XI_PRM_HEIGHT, 512);
81
    HandleResult(stat,"xiSetParam (XI_PRM_HEIGHT)");
82
    stat = xiSetParamInt(camera, XI_PRM_OFFSET_X, 320);
83
    HandleResult(stat,"xiSetParam (XI_PRM_OFFSET_X)");
84
    stat = xiSetParamInt(camera, XI_PRM_OFFSET_Y, 256);
85
    HandleResult(stat,"xiSetParam (XI_PRM_OFFSET_Y)");
86
 
87
    // Setting reasonable default settings
88
    xiSetParamFloat(camera, XI_PRM_GAMMAY, 1.0);
89
    xiSetParamInt(camera, XI_PRM_EXPOSURE, 16666); //us
90
    xiSetParamFloat(camera, XI_PRM_GAIN, 0);
91
 
18 jakw 92
}
1 jakw 93
 
18 jakw 94
CameraSettings CameraXIMEA::getCameraSettings(){
95
 
96
    CameraSettings settings;
97
 
98
    int shutter;
99
    xiGetParamInt(camera, XI_PRM_EXPOSURE, &shutter);
100
    settings.shutter = shutter/1000.0; // from us to ms
101
    xiGetParamFloat(camera, XI_PRM_GAIN, &settings.gain);
102
 
103
    return settings;
1 jakw 104
}
105
 
18 jakw 106
void CameraXIMEA::setCameraSettings(CameraSettings settings){
107
 
108
    // Set shutter (in us)
109
    xiSetParamInt(camera, XI_PRM_EXPOSURE, settings.shutter*1000);
110
    // Set gain (in dB)
111
    xiSetParamFloat(camera, XI_PRM_GAIN, settings.gain);
112
 
113
    std::cout << "Setting camera parameters:" << std::endl
114
              << "Shutter: " << settings.shutter << " ms" << std::endl
115
              << "Gain: " << settings.gain << " dB" << std::endl;
116
}
117
 
1 jakw 118
void CameraXIMEA::startCapture(){
119
 
18 jakw 120
    if(triggerMode == triggerModeHardware){
121
        // Configure for hardware trigger
122
        stat = xiSetParamInt(camera, XI_PRM_TRG_SOURCE, XI_TRG_EDGE_RISING);
123
        HandleResult(stat,"xiSetParam (XI_PRM_TRG_SOURCE)");
124
    } else if(triggerMode == triggerModeSoftware){
125
        // Configure for software trigger (for getSingleFrame())
126
        stat = xiSetParamInt(camera, XI_PRM_TRG_SOURCE, XI_TRG_SOFTWARE);
127
        HandleResult(stat,"xiSetParam (XI_PRM_TRG_SOURCE)");
128
    }
1 jakw 129
 
18 jakw 130
    // Start aquistion
131
    stat = xiStartAcquisition(camera);
132
    HandleResult(stat,"xiStartAcquisition");
133
 
1 jakw 134
    capturing = true;
135
 
136
}
137
 
138
void CameraXIMEA::stopCapture(){
139
 
140
    if(!capturing){
141
        std::cerr << "CameraXIMEA: not capturing!" << std::endl;
142
        return;
143
    }
144
 
145
}
146
 
18 jakw 147
CameraFrame CameraXIMEA::getFrame(){
1 jakw 148
 
149
    // Create single image buffer
150
    XI_IMG image;
18 jakw 151
    image.size = SIZE_XI_IMG_V2; // must be initialized
1 jakw 152
    image.bp = NULL;
153
    image.bp_size = 0;
154
 
18 jakw 155
    if(triggerMode == triggerModeSoftware){
156
        // Fire software trigger
157
        stat = xiSetParamInt(camera, XI_PRM_TRG_SOFTWARE, 0);
158
        HandleResult(stat,"xiSetParam (XI_PRM_TRG_SOFTWARE)");
1 jakw 159
 
18 jakw 160
        // Retrieve image from camera
161
        stat = xiGetImage(camera, 1000, &image);
162
        HandleResult(stat,"xiGetImage");
163
    } else {
1 jakw 164
 
18 jakw 165
        // Retrieve image from camera
166
        stat = xiGetImage(camera, 50, &image);
167
        HandleResult(stat,"xiGetImage");
168
    }
1 jakw 169
 
18 jakw 170
    // Empty buffer
171
    while(xiGetImage(camera, 1, &image) == XI_OK){
172
        std::cerr << "drop!" << std::endl;
173
        continue;
174
    }
1 jakw 175
 
176
    CameraFrame frame;
177
    frame.height = image.height;
178
    frame.width = image.width;
18 jakw 179
    frame.memory = (unsigned short*)image.bp;
180
    frame.bitDepth = 10;
1 jakw 181
    frame.timeStamp = image.tsUSec;
182
    frame.sizeBytes = image.bp_size;
183
 
184
    return frame;
185
}
186
 
187
 
188
size_t CameraXIMEA::getFrameSizeBytes(){
189
    return 0;
190
}
191
 
18 jakw 192
size_t CameraXIMEA::getFrameWidth(){
193
    int w;
1 jakw 194
    xiGetParamInt(camera, XI_PRM_WIDTH, &w);
195
 
18 jakw 196
    return w;
1 jakw 197
}
198
 
18 jakw 199
size_t CameraXIMEA::getFrameHeight(){
200
    int h;
201
    xiGetParamInt(camera, XI_PRM_HEIGHT, &h);
1 jakw 202
 
18 jakw 203
    return h;
1 jakw 204
}
205
 
206
CameraXIMEA::~CameraXIMEA(){
207
 
18 jakw 208
    if(capturing){
209
        // Stop acquisition
210
        stat = xiStopAcquisition(camera);
211
        HandleResult(stat,"xiStopAcquisition");
212
    }
1 jakw 213
 
214
    // Close device
215
    xiCloseDevice(camera);
216
}
217
 
218