1 |
|
2 | #include "precomp.hpp"
|
3 |
|
4 | #include "xiApi.h"
|
5 | #include "xiExt.h"
|
6 |
|
7 |
|
8 |
|
9 | class CvCaptureCAM_XIMEA : public CvCapture
|
10 | {
|
11 | public:
|
12 | CvCaptureCAM_XIMEA() { init(); }
|
13 | virtual ~CvCaptureCAM_XIMEA() { close(); }
|
14 |
|
15 | virtual bool open( int index );
|
16 | virtual void close();
|
17 | virtual double getProperty(int);
|
18 | virtual bool setProperty(int, double);
|
19 | virtual bool grabFrame();
|
20 | virtual IplImage* retrieveFrame(int);
|
21 | virtual int getCaptureDomain() { return CV_CAP_XIAPI; }
|
22 |
|
23 | protected:
|
24 | void init();
|
25 | void errMsg(char* msg, int errNum);
|
26 | IplImage* frame;
|
27 |
|
28 | HANDLE hmv;
|
29 | DWORD numDevices;
|
30 | XI_IMG image;
|
31 | int width;
|
32 | int height;
|
33 | int format;
|
34 | int timeout;
|
35 | };
|
36 |
|
37 |
|
38 |
|
39 | CvCapture* cvCreateCameraCapture_XIMEA( int index )
|
40 | {
|
41 | CvCaptureCAM_XIMEA* capture = new CvCaptureCAM_XIMEA;
|
42 |
|
43 | if( capture->open( index ))
|
44 | return capture;
|
45 |
|
46 | delete capture;
|
47 | return 0;
|
48 | }
|
49 |
|
50 |
|
51 |
|
52 | void CvCaptureCAM_XIMEA::init()
|
53 | {
|
54 | xiGetNumberDevices( &numDevices);
|
55 | hmv = NULL;
|
56 | memset(&image, 0, sizeof(XI_IMG));
|
57 | }
|
58 |
|
59 |
|
60 |
|
61 |
|
62 | bool CvCaptureCAM_XIMEA::open( int wIndex )
|
63 | {
|
64 | int mvret = XI_OK;
|
65 |
|
66 | if(numDevices == 0)
|
67 | return false;
|
68 |
|
69 | if((mvret = xiOpenDevice( wIndex, &hmv)) != XI_OK)
|
70 | {
|
71 | errMsg("Open XI_DEVICE failed", mvret);
|
72 | return false;
|
73 | }
|
74 |
|
75 |
|
76 | mvret = xiSetParamInt( hmv, XI_PRM_AEAG, 1);
|
77 | if(mvret != XI_OK) goto error;
|
78 |
|
79 |
|
80 | mvret = xiSetParamInt( hmv, XI_PRM_AUTO_WB, 1);
|
81 | if(mvret != XI_OK) goto error;
|
82 |
|
83 | mvret = xiGetParamInt( hmv, XI_PRM_WIDTH, &width);
|
84 | if(mvret != XI_OK) goto error;
|
85 |
|
86 | mvret = xiGetParamInt( hmv, XI_PRM_HEIGHT, &height);
|
87 | if(mvret != XI_OK) goto error;
|
88 |
|
89 |
|
90 | format = XI_MONO8;
|
91 | mvret = xiSetParamInt( hmv, XI_PRM_IMAGE_DATA_FORMAT, format);
|
92 | if(mvret != XI_OK) goto error;
|
93 |
|
94 |
|
95 | frame = cvCreateImage(cvSize( width, height), IPL_DEPTH_8U, 1);
|
96 |
|
97 |
|
98 | timeout = 10000;
|
99 |
|
100 | mvret = xiStartAcquisition(hmv);
|
101 | if(mvret != XI_OK)
|
102 | {
|
103 | errMsg("StartAcquisition XI_DEVICE failed", mvret);
|
104 | goto error;
|
105 | }
|
106 |
|
107 | return true;
|
108 |
|
109 | error:
|
110 | xiCloseDevice(hmv);
|
111 | hmv = NULL;
|
112 | return false;
|
113 | }
|
114 |
|
115 |
|
116 |
|
117 | void CvCaptureCAM_XIMEA::close()
|
118 | {
|
119 | xiStopAcquisition(hmv);
|
120 | xiCloseDevice(hmv);
|
121 | hmv = NULL;
|
122 | }
|
123 |
|
124 |
|
125 |
|
126 | bool CvCaptureCAM_XIMEA::grabFrame()
|
127 | {
|
128 | int mvret = XI_OK;
|
129 | image.size = sizeof(XI_IMG);
|
130 | if((mvret = xiGetImage( hmv, timeout, &image)) != XI_OK)
|
131 | {
|
132 | errMsg("Error during GetImage", mvret);
|
133 | return false;
|
134 | }
|
135 | return true;
|
136 | }
|
137 |
|
138 |
|
139 |
|
140 | IplImage* CvCaptureCAM_XIMEA::retrieveFrame(int)
|
141 | {
|
142 |
|
143 | if( image.width == width && image.height == height && image.frm == (XI_IMG_FORMAT) format)
|
144 | {
|
145 | cvReleaseImage(&frame);
|
146 | switch( image.frm)
|
147 | {
|
148 | case XI_RAW8 :
|
149 | case XI_MONO8 : frame = cvCreateImage(cvSize( image.width, image.height), IPL_DEPTH_8U, 1); break;
|
150 | case XI_RAW16 :
|
151 | case XI_MONO16 : frame = cvCreateImage(cvSize( image.width, image.height), IPL_DEPTH_16U, 1); break;
|
152 | case XI_RGB24 : frame = cvCreateImage(cvSize( image.width, image.height), IPL_DEPTH_8U, 3); break;
|
153 | case XI_RGB32 : frame = cvCreateImage(cvSize( image.width, image.height), IPL_DEPTH_8U, 4); break;
|
154 | default :
|
155 | return frame;
|
156 | }
|
157 |
|
158 | format = image.frm;
|
159 | width = image.width;
|
160 | height = image.height;
|
161 |
|
162 |
|
163 | switch( image.frm)
|
164 | {
|
165 | case XI_RAW8 :
|
166 | case XI_MONO8 : memcpy( frame->imageData, image.bp, image.width*image.height); break;
|
167 | case XI_RAW16 :
|
168 | case XI_MONO16 : memcpy( frame->imageData, image.bp, image.width*image.height*sizeof(WORD)); break;
|
169 | case XI_RGB24 : memcpy( frame->imageData, image.bp, image.width*image.height*3); break;
|
170 | case XI_RGB32 : memcpy( frame->imageData, image.bp, image.width*image.height*sizeof(DWORD)); break;
|
171 | }
|
172 | }
|
173 | return frame;
|
174 | }
|
175 |
|
176 |
|
177 |
|
178 | double CvCaptureCAM_XIMEA::getProperty( int property_id )
|
179 | {
|
180 | if(hmv == NULL)
|
181 | return 0;
|
182 |
|
183 | int ival = 0;
|
184 | float fval = 0;
|
185 |
|
186 | switch( property_id )
|
187 | {
|
188 |
|
189 | case CV_CAP_PROP_POS_FRAMES : return (double) image.nframe;
|
190 | case CV_CAP_PROP_FRAME_WIDTH : xiGetParamInt( hmv, XI_PRM_WIDTH, &ival); return ival;
|
191 | case CV_CAP_PROP_FRAME_HEIGHT : xiGetParamInt( hmv, XI_PRM_HEIGHT, &ival); return ival;
|
192 | case CV_CAP_PROP_FPS : xiGetParamFloat( hmv, XI_PRM_FRAMERATE, &fval); return fval;
|
193 | case CV_CAP_PROP_GAIN : xiGetParamFloat( hmv, XI_PRM_GAIN, &fval); return fval;
|
194 | case CV_CAP_PROP_EXPOSURE : xiGetParamInt( hmv, XI_PRM_EXPOSURE, &ival); return ival;
|
195 |
|
196 |
|
197 | case CV_CAP_PROP_XI_DOWNSAMPLING : xiGetParamInt( hmv, XI_PRM_DOWNSAMPLING, &ival); return ival;
|
198 | case CV_CAP_PROP_XI_DATA_FORMAT : xiGetParamInt( hmv, XI_PRM_IMAGE_DATA_FORMAT, &ival); return ival;
|
199 | case CV_CAP_PROP_XI_OFFSET_X : xiGetParamInt( hmv, XI_PRM_OFFSET_X, &ival); return ival;
|
200 | case CV_CAP_PROP_XI_OFFSET_Y : xiGetParamInt( hmv, XI_PRM_OFFSET_Y, &ival); return ival;
|
201 | case CV_CAP_PROP_XI_TRG_SOURCE : xiGetParamInt( hmv, XI_PRM_TRG_SOURCE, &ival); return ival;
|
202 | case CV_CAP_PROP_XI_GPI_SELECTOR : xiGetParamInt( hmv, XI_PRM_GPI_SELECTOR, &ival); return ival;
|
203 | case CV_CAP_PROP_XI_GPI_MODE : xiGetParamInt( hmv, XI_PRM_GPI_MODE, &ival); return ival;
|
204 | case CV_CAP_PROP_XI_GPI_LEVEL : xiGetParamInt( hmv, XI_PRM_GPI_LEVEL, &ival); return ival;
|
205 | case CV_CAP_PROP_XI_GPO_SELECTOR : xiGetParamInt( hmv, XI_PRM_GPO_SELECTOR, &ival); return ival;
|
206 | case CV_CAP_PROP_XI_GPO_MODE : xiGetParamInt( hmv, XI_PRM_GPO_MODE, &ival); return ival;
|
207 | case CV_CAP_PROP_XI_LED_SELECTOR : xiGetParamInt( hmv, XI_PRM_LED_SELECTOR, &ival); return ival;
|
208 | case CV_CAP_PROP_XI_LED_MODE : xiGetParamInt( hmv, XI_PRM_LED_MODE, &ival); return ival;
|
209 | case CV_CAP_PROP_XI_AUTO_WB : xiGetParamInt( hmv, XI_PRM_AUTO_WB, &ival); return ival;
|
210 | case CV_CAP_PROP_XI_AEAG : xiGetParamInt( hmv, XI_PRM_AEAG, &ival); return ival;
|
211 | case CV_CAP_PROP_XI_EXP_PRIORITY : xiGetParamFloat( hmv, XI_PRM_EXP_PRIORITY, &fval); return fval;
|
212 | case CV_CAP_PROP_XI_AE_MAX_LIMIT : xiGetParamInt( hmv, XI_PRM_EXP_PRIORITY, &ival); return ival;
|
213 | case CV_CAP_PROP_XI_AG_MAX_LIMIT : xiGetParamFloat( hmv, XI_PRM_AG_MAX_LIMIT, &fval); return fval;
|
214 | case CV_CAP_PROP_XI_AEAG_LEVEL : xiGetParamInt( hmv, XI_PRM_AEAG_LEVEL, &ival); return ival;
|
215 | case CV_CAP_PROP_XI_TIMEOUT : return timeout;
|
216 |
|
217 | }
|
218 | return 0;
|
219 | }
|
220 |
|
221 |
|
222 |
|
223 | bool CvCaptureCAM_XIMEA::setProperty( int property_id, double value )
|
224 | {
|
225 | int ival = (int) value;
|
226 | float fval = (float) value;
|
227 |
|
228 | int mvret = XI_OK;
|
229 |
|
230 | switch(property_id)
|
231 | {
|
232 |
|
233 | case CV_CAP_PROP_FRAME_WIDTH : mvret = xiSetParamInt( hmv, XI_PRM_WIDTH, ival);
|
234 | if(mvret == XI_OK) width = ival;
|
235 | break;
|
236 | case CV_CAP_PROP_FRAME_HEIGHT : mvret = xiSetParamInt( hmv, XI_PRM_HEIGHT, ival);
|
237 | if(mvret == XI_OK) height = ival;
|
238 | break;
|
239 | case CV_CAP_PROP_FPS : mvret = xiSetParamFloat( hmv, XI_PRM_FRAMERATE, fval); break;
|
240 | case CV_CAP_PROP_GAIN : mvret = xiSetParamFloat( hmv, XI_PRM_GAIN, fval); break;
|
241 | case CV_CAP_PROP_EXPOSURE : mvret = xiSetParamInt( hmv, XI_PRM_EXPOSURE, ival); break;
|
242 |
|
243 | case CV_CAP_PROP_XI_DOWNSAMPLING : mvret = xiSetParamInt( hmv, XI_PRM_DOWNSAMPLING, ival); break;
|
244 | case CV_CAP_PROP_XI_DATA_FORMAT : mvret = xiSetParamInt( hmv, XI_PRM_IMAGE_DATA_FORMAT, ival);
|
245 | if(mvret == XI_OK) format = ival;
|
246 | break;
|
247 | case CV_CAP_PROP_XI_OFFSET_X : mvret = xiSetParamInt( hmv, XI_PRM_OFFSET_X, ival); break;
|
248 | case CV_CAP_PROP_XI_OFFSET_Y : mvret = xiSetParamInt( hmv, XI_PRM_OFFSET_Y, ival); break;
|
249 | case CV_CAP_PROP_XI_TRG_SOURCE : mvret = xiSetParamInt( hmv, XI_PRM_TRG_SOURCE, ival); break;
|
250 | case CV_CAP_PROP_XI_GPI_SELECTOR : mvret = xiSetParamInt( hmv, XI_PRM_GPI_SELECTOR, ival); break;
|
251 | case CV_CAP_PROP_XI_TRG_SOFTWARE : mvret = xiSetParamInt( hmv, XI_PRM_TRG_SOURCE, 1); break;
|
252 | case CV_CAP_PROP_XI_GPI_MODE : mvret = xiSetParamInt( hmv, XI_PRM_GPI_MODE, ival); break;
|
253 | case CV_CAP_PROP_XI_GPI_LEVEL : mvret = xiSetParamInt( hmv, XI_PRM_GPI_LEVEL, ival); break;
|
254 | case CV_CAP_PROP_XI_GPO_SELECTOR : mvret = xiSetParamInt( hmv, XI_PRM_GPO_SELECTOR, ival); break;
|
255 | case CV_CAP_PROP_XI_GPO_MODE : mvret = xiSetParamInt( hmv, XI_PRM_GPO_MODE, ival); break;
|
256 | case CV_CAP_PROP_XI_LED_SELECTOR : mvret = xiSetParamInt( hmv, XI_PRM_LED_SELECTOR, ival); break;
|
257 | case CV_CAP_PROP_XI_LED_MODE : mvret = xiSetParamInt( hmv, XI_PRM_LED_MODE, ival); break;
|
258 | case CV_CAP_PROP_XI_AUTO_WB : mvret = xiSetParamInt( hmv, XI_PRM_AUTO_WB, ival); break;
|
259 | case CV_CAP_PROP_XI_MANUAL_WB : mvret = xiSetParamInt( hmv, XI_PRM_LED_MODE, ival); break;
|
260 | case CV_CAP_PROP_XI_AEAG : mvret = xiSetParamInt( hmv, XI_PRM_AEAG, ival); break;
|
261 | case CV_CAP_PROP_XI_EXP_PRIORITY : mvret = xiSetParamFloat( hmv, XI_PRM_EXP_PRIORITY, fval); break;
|
262 | case CV_CAP_PROP_XI_AE_MAX_LIMIT : mvret = xiSetParamInt( hmv, XI_PRM_EXP_PRIORITY, ival); break;
|
263 | case CV_CAP_PROP_XI_AG_MAX_LIMIT : mvret = xiSetParamFloat( hmv, XI_PRM_AG_MAX_LIMIT, fval); break;
|
264 | case CV_CAP_PROP_XI_AEAG_LEVEL : mvret = xiSetParamInt( hmv, XI_PRM_AEAG_LEVEL, ival); break;
|
265 | case CV_CAP_PROP_XI_TIMEOUT : timeout = ival; break;
|
266 | }
|
267 |
|
268 | if(mvret != XI_OK)
|
269 | {
|
270 | errMsg("Set parameter error", mvret);
|
271 | return false;
|
272 | }
|
273 | else
|
274 | return true;
|
275 |
|
276 | }
|
277 |
|
278 |
|
279 |
|
280 | void CvCaptureCAM_XIMEA::errMsg(char* msg, int errNum)
|
281 | {
|
282 | char buf[512];
|
283 | sprintf( buf, "%s : %d\n", msg, errNum);
|
284 | OutputDebugString(buf);
|
285 | }
|
286 |
|
287 | |