1 // testOpenCVCam.cpp : Defines the entry point for the console application.
2 //
3
4 #include "opencv2/videoio/videoio.hpp"
5 #include "opencv2/highgui/highgui.hpp"
6
7 #include <iostream>
8
9 using namespace cv;
10 using namespace std;
11
12 static bool g_printStreamSetting = false;
13 static int g_imageStreamProfileIdx = -1;
14 static int g_depthStreamProfileIdx = -1;
15 static bool g_irStreamShow = false;
16 static double g_imageBrightness = -DBL_MAX;
17 static double g_imageContrast = -DBL_MAX;
18 static bool g_printTiming = false;
19 static bool g_showClosedPoint = false;
20
21
22 static int g_closedDepthPoint[2];
23
printUsage(const char * arg0)24 static void printUsage(const char *arg0)
25 {
26 const char *filename = arg0;
27 while (*filename)
28 filename++;
29 while ((arg0 <= filename) && ('\\' != *filename) && ('/' != *filename))
30 filename--;
31 filename++;
32
33 cout << "This program demonstrates usage of camera supported\nby Intel Perceptual computing SDK." << endl << endl;
34 cout << "usage: " << filename << "[-ps] [-isp IDX] [-dsp IDX]\n [-ir] [-imb VAL] [-imc VAL]" << endl << endl;
35 cout << " -ps, print streams setting and profiles" << endl;
36 cout << " -isp IDX, set profile index of the image stream" << endl;
37 cout << " -dsp IDX, set profile index of the depth stream" << endl;
38 cout << " -ir, show data from IR stream" << endl;
39 cout << " -imb VAL, set brighness value for a image stream" << endl;
40 cout << " -imc VAL, set contrast value for a image stream" << endl;
41 cout << " -pts, print frame index and frame time" << endl;
42 cout << " --show-closed, print frame index and frame time" << endl;
43 cout << endl;
44 }
45
parseCMDLine(int argc,char * argv[])46 static void parseCMDLine(int argc, char* argv[])
47 {
48 if( argc == 1 )
49 {
50 printUsage(argv[0]);
51 }
52 else
53 {
54 for( int i = 1; i < argc; i++ )
55 {
56 if ((0 == strcmp(argv[i], "--help")) || (0 == strcmp( argv[i], "-h")))
57 {
58 printUsage(argv[0]);
59 exit(0);
60 }
61 else if ((0 == strcmp( argv[i], "--print-streams")) || (0 == strcmp( argv[i], "-ps")))
62 {
63 g_printStreamSetting = true;
64 }
65 else if ((0 == strcmp( argv[i], "--image-stream-prof")) || (0 == strcmp( argv[i], "-isp")))
66 {
67 g_imageStreamProfileIdx = atoi(argv[++i]);
68 }
69 else if ((0 == strcmp( argv[i], "--depth-stream-prof")) || (0 == strcmp( argv[i], "-dsp")))
70 {
71 g_depthStreamProfileIdx = atoi(argv[++i]);
72 }
73 else if (0 == strcmp( argv[i], "-ir"))
74 {
75 g_irStreamShow = true;
76 }
77 else if (0 == strcmp( argv[i], "-imb"))
78 {
79 g_imageBrightness = atof(argv[++i]);
80 }
81 else if (0 == strcmp( argv[i], "-imc"))
82 {
83 g_imageContrast = atof(argv[++i]);
84 }
85 else if (0 == strcmp(argv[i], "-pts"))
86 {
87 g_printTiming = true;
88 }
89 else if (0 == strcmp(argv[i], "--show-closed"))
90 {
91 g_showClosedPoint = true;
92 }
93 else
94 {
95 cout << "Unsupported command line argument: " << argv[i] << "." << endl;
96 exit(-1);
97 }
98 }
99 if (g_showClosedPoint && (-1 == g_depthStreamProfileIdx))
100 {
101 cerr << "For --show-closed depth profile has be selected" << endl;
102 exit(-1);
103 }
104 }
105 }
106
printStreamProperties(VideoCapture & capture)107 static void printStreamProperties(VideoCapture &capture)
108 {
109 size_t profilesCount = (size_t)capture.get(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_INTELPERC_PROFILE_COUNT);
110 cout << "Image stream." << endl;
111 cout << " Brightness = " << capture.get(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_BRIGHTNESS) << endl;
112 cout << " Contrast = " << capture.get(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_CONTRAST) << endl;
113 cout << " Saturation = " << capture.get(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_SATURATION) << endl;
114 cout << " Hue = " << capture.get(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_HUE) << endl;
115 cout << " Gamma = " << capture.get(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_GAMMA) << endl;
116 cout << " Sharpness = " << capture.get(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_SHARPNESS) << endl;
117 cout << " Gain = " << capture.get(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_GAIN) << endl;
118 cout << " Backligh = " << capture.get(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_BACKLIGHT) << endl;
119 cout << "Image streams profiles:" << endl;
120 for (size_t i = 0; i < profilesCount; i++)
121 {
122 capture.set(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_INTELPERC_PROFILE_IDX, (double)i);
123 cout << " Profile[" << i << "]: ";
124 cout << "width = " <<
125 (int)capture.get(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_FRAME_WIDTH);
126 cout << ", height = " <<
127 (int)capture.get(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_FRAME_HEIGHT);
128 cout << ", fps = " <<
129 capture.get(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_FPS);
130 cout << endl;
131 }
132
133 profilesCount = (size_t)capture.get(CAP_INTELPERC_DEPTH_GENERATOR | CAP_PROP_INTELPERC_PROFILE_COUNT);
134 cout << "Depth stream." << endl;
135 cout << " Low confidence value = " << capture.get(CAP_INTELPERC_DEPTH_GENERATOR | CAP_PROP_INTELPERC_DEPTH_LOW_CONFIDENCE_VALUE) << endl;
136 cout << " Saturation value = " << capture.get(CAP_INTELPERC_DEPTH_GENERATOR | CAP_PROP_INTELPERC_DEPTH_SATURATION_VALUE) << endl;
137 cout << " Confidence threshold = " << capture.get(CAP_INTELPERC_DEPTH_GENERATOR | CAP_PROP_INTELPERC_DEPTH_CONFIDENCE_THRESHOLD) << endl;
138 cout << " Focal length = (" << capture.get(CAP_INTELPERC_DEPTH_GENERATOR | CAP_PROP_INTELPERC_DEPTH_FOCAL_LENGTH_HORZ) << ", "
139 << capture.get(CAP_INTELPERC_DEPTH_GENERATOR | CAP_PROP_INTELPERC_DEPTH_FOCAL_LENGTH_VERT) << ")" << endl;
140 cout << "Depth streams profiles:" << endl;
141 for (size_t i = 0; i < profilesCount; i++)
142 {
143 capture.set(CAP_INTELPERC_DEPTH_GENERATOR | CAP_PROP_INTELPERC_PROFILE_IDX, (double)i);
144 cout << " Profile[" << i << "]: ";
145 cout << "width = " <<
146 (int)capture.get(CAP_INTELPERC_DEPTH_GENERATOR | CAP_PROP_FRAME_WIDTH);
147 cout << ", height = " <<
148 (int)capture.get(CAP_INTELPERC_DEPTH_GENERATOR | CAP_PROP_FRAME_HEIGHT);
149 cout << ", fps = " <<
150 capture.get(CAP_INTELPERC_DEPTH_GENERATOR | CAP_PROP_FPS);
151 cout << endl;
152 }
153 }
154
imshowImage(const char * winname,Mat & image,VideoCapture & capture)155 static void imshowImage(const char *winname, Mat &image, VideoCapture &capture)
156 {
157 if (g_showClosedPoint)
158 {
159 Mat uvMap;
160 if (capture.retrieve(uvMap, CAP_INTELPERC_UVDEPTH_MAP))
161 {
162 float *uvmap = (float *)uvMap.ptr() + 2 * (g_closedDepthPoint[0] * uvMap.cols + g_closedDepthPoint[1]);
163 int x = (int)((*uvmap) * image.cols); uvmap++;
164 int y = (int)((*uvmap) * image.rows);
165
166 if ((0 <= x) && (0 <= y))
167 {
168 static const int pointSize = 4;
169 for (int row = y; row < min(y + pointSize, image.rows); row++)
170 {
171 uchar* ptrDst = image.ptr(row) + x * 3 + 2;//+2 -> Red
172 for (int col = 0; col < min(pointSize, image.cols - x); col++, ptrDst+=3)
173 {
174 *ptrDst = 255;
175 }
176 }
177 }
178 }
179 }
180 imshow(winname, image);
181 }
imshowIR(const char * winname,Mat & ir)182 static void imshowIR(const char *winname, Mat &ir)
183 {
184 Mat image;
185 if (g_showClosedPoint)
186 {
187 image.create(ir.rows, ir.cols, CV_8UC3);
188 for (int row = 0; row < ir.rows; row++)
189 {
190 uchar* ptrDst = image.ptr(row);
191 short* ptrSrc = (short*)ir.ptr(row);
192 for (int col = 0; col < ir.cols; col++, ptrSrc++)
193 {
194 uchar val = (uchar) ((*ptrSrc) >> 2);
195 *ptrDst = val; ptrDst++;
196 *ptrDst = val; ptrDst++;
197 *ptrDst = val; ptrDst++;
198 }
199 }
200
201 static const int pointSize = 4;
202 for (int row = g_closedDepthPoint[0]; row < min(g_closedDepthPoint[0] + pointSize, image.rows); row++)
203 {
204 uchar* ptrDst = image.ptr(row) + g_closedDepthPoint[1] * 3 + 2;//+2 -> Red
205 for (int col = 0; col < min(pointSize, image.cols - g_closedDepthPoint[1]); col++, ptrDst+=3)
206 {
207 *ptrDst = 255;
208 }
209 }
210 }
211 else
212 {
213 image.create(ir.rows, ir.cols, CV_8UC1);
214 for (int row = 0; row < ir.rows; row++)
215 {
216 uchar* ptrDst = image.ptr(row);
217 short* ptrSrc = (short*)ir.ptr(row);
218 for (int col = 0; col < ir.cols; col++, ptrSrc++, ptrDst++)
219 {
220 *ptrDst = (uchar) ((*ptrSrc) >> 2);
221 }
222 }
223 }
224
225 imshow(winname, image);
226 }
imshowDepth(const char * winname,Mat & depth,VideoCapture & capture)227 static void imshowDepth(const char *winname, Mat &depth, VideoCapture &capture)
228 {
229 short lowValue = (short)capture.get(CAP_INTELPERC_DEPTH_GENERATOR | CAP_PROP_INTELPERC_DEPTH_LOW_CONFIDENCE_VALUE);
230 short saturationValue = (short)capture.get(CAP_INTELPERC_DEPTH_GENERATOR | CAP_PROP_INTELPERC_DEPTH_SATURATION_VALUE);
231
232 Mat image;
233 if (g_showClosedPoint)
234 {
235 image.create(depth.rows, depth.cols, CV_8UC3);
236 for (int row = 0; row < depth.rows; row++)
237 {
238 uchar* ptrDst = image.ptr(row);
239 short* ptrSrc = (short*)depth.ptr(row);
240 for (int col = 0; col < depth.cols; col++, ptrSrc++)
241 {
242 if ((lowValue == (*ptrSrc)) || (saturationValue == (*ptrSrc)))
243 {
244 *ptrDst = 0; ptrDst++;
245 *ptrDst = 0; ptrDst++;
246 *ptrDst = 0; ptrDst++;
247 }
248 else
249 {
250 uchar val = (uchar) ((*ptrSrc) >> 2);
251 *ptrDst = val; ptrDst++;
252 *ptrDst = val; ptrDst++;
253 *ptrDst = val; ptrDst++;
254 }
255 }
256 }
257
258 static const int pointSize = 4;
259 for (int row = g_closedDepthPoint[0]; row < min(g_closedDepthPoint[0] + pointSize, image.rows); row++)
260 {
261 uchar* ptrDst = image.ptr(row) + g_closedDepthPoint[1] * 3 + 2;//+2 -> Red
262 for (int col = 0; col < min(pointSize, image.cols - g_closedDepthPoint[1]); col++, ptrDst+=3)
263 {
264 *ptrDst = 255;
265 }
266 }
267 }
268 else
269 {
270 image.create(depth.rows, depth.cols, CV_8UC1);
271 for (int row = 0; row < depth.rows; row++)
272 {
273 uchar* ptrDst = image.ptr(row);
274 short* ptrSrc = (short*)depth.ptr(row);
275 for (int col = 0; col < depth.cols; col++, ptrSrc++, ptrDst++)
276 {
277 if ((lowValue == (*ptrSrc)) || (saturationValue == (*ptrSrc)))
278 *ptrDst = 0;
279 else
280 *ptrDst = (uchar) ((*ptrSrc) >> 2);
281 }
282 }
283 }
284 imshow(winname, image);
285 }
286
main(int argc,char * argv[])287 int main(int argc, char* argv[])
288 {
289 parseCMDLine(argc, argv);
290
291 VideoCapture capture;
292 capture.open(CAP_INTELPERC);
293 if (!capture.isOpened())
294 {
295 cerr << "Can not open a capture object." << endl;
296 return -1;
297 }
298
299 if (g_printStreamSetting)
300 printStreamProperties(capture);
301
302 if (-1 != g_imageStreamProfileIdx)
303 {
304 if (!capture.set(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_INTELPERC_PROFILE_IDX, (double)g_imageStreamProfileIdx))
305 {
306 cerr << "Can not setup a image stream." << endl;
307 return -1;
308 }
309 }
310 if (-1 != g_depthStreamProfileIdx)
311 {
312 if (!capture.set(CAP_INTELPERC_DEPTH_GENERATOR | CAP_PROP_INTELPERC_PROFILE_IDX, (double)g_depthStreamProfileIdx))
313 {
314 cerr << "Can not setup a depth stream." << endl;
315 return -1;
316 }
317 }
318 else if (g_irStreamShow)
319 {
320 if (!capture.set(CAP_INTELPERC_DEPTH_GENERATOR | CAP_PROP_INTELPERC_PROFILE_IDX, 0.0))
321 {
322 cerr << "Can not setup a IR stream." << endl;
323 return -1;
324 }
325 }
326 else
327 {
328 cout << "Streams not selected" << endl;
329 return 0;
330 }
331
332 //Setup additional properies only after set profile of the stream
333 if ( (-10000.0 < g_imageBrightness) && (g_imageBrightness < 10000.0))
334 capture.set(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_BRIGHTNESS, g_imageBrightness);
335 if ( (0 < g_imageContrast) && (g_imageContrast < 10000.0))
336 capture.set(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_BRIGHTNESS, g_imageContrast);
337
338 int frame = 0;
339 for(;;frame++)
340 {
341 Mat bgrImage;
342 Mat depthImage;
343 Mat irImage;
344
345 if (!capture.grab())
346 {
347 cout << "Can not grab images." << endl;
348 return -1;
349 }
350
351 if ((-1 != g_depthStreamProfileIdx) && (capture.retrieve(depthImage, CAP_INTELPERC_DEPTH_MAP)))
352 {
353 if (g_showClosedPoint)
354 {
355 double minVal = 0.0; double maxVal = 0.0;
356 minMaxIdx(depthImage, &minVal, &maxVal, g_closedDepthPoint);
357 }
358 imshowDepth("depth image", depthImage, capture);
359 }
360 if ((g_irStreamShow) && (capture.retrieve(irImage, CAP_INTELPERC_IR_MAP)))
361 imshowIR("ir image", irImage);
362 if ((-1 != g_imageStreamProfileIdx) && (capture.retrieve(bgrImage, CAP_INTELPERC_IMAGE)))
363 imshowImage("color image", bgrImage, capture);
364
365 if (g_printTiming)
366 {
367 cout << "Image frame: " << capture.get(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_POS_FRAMES)
368 << ", Depth(IR) frame: " << capture.get(CAP_INTELPERC_DEPTH_GENERATOR | CAP_PROP_POS_FRAMES) << endl;
369 cout << "Image frame: " << capture.get(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_POS_MSEC)
370 << ", Depth(IR) frame: " << capture.get(CAP_INTELPERC_DEPTH_GENERATOR | CAP_PROP_POS_MSEC) << endl;
371 }
372 if( waitKey(30) >= 0 )
373 break;
374 }
375
376 return 0;
377 }
378