mirror of https://github.com/opencv/opencv.git
Merge pull request #21279 from cabelo:new-example-intelrealsense
commit
defd8a527b
3 changed files with 34 additions and 353 deletions
@ -1,352 +0,0 @@ |
|||||||
#include "opencv2/videoio.hpp" |
|
||||||
#include "opencv2/highgui.hpp" |
|
||||||
|
|
||||||
#include <iostream> |
|
||||||
|
|
||||||
using namespace cv; |
|
||||||
using namespace std; |
|
||||||
|
|
||||||
static bool g_printStreamSetting; |
|
||||||
static int g_imageStreamProfileIdx; |
|
||||||
static int g_depthStreamProfileIdx; |
|
||||||
static bool g_irStreamShow; |
|
||||||
static double g_imageBrightness; |
|
||||||
static double g_imageContrast; |
|
||||||
static bool g_printTiming; |
|
||||||
static bool g_showClosedPoint; |
|
||||||
|
|
||||||
|
|
||||||
static int g_closedDepthPoint[2]; |
|
||||||
|
|
||||||
static void printUsage(const char *arg0) |
|
||||||
{ |
|
||||||
const char *filename = arg0; |
|
||||||
while (*filename) |
|
||||||
filename++; |
|
||||||
while ((arg0 <= filename) && ('\\' != *filename) && ('/' != *filename)) |
|
||||||
filename--; |
|
||||||
filename++; |
|
||||||
|
|
||||||
cout << "This program demonstrates usage of camera supported\nby Intel Perceptual computing SDK." << endl << endl; |
|
||||||
cout << "usage: " << filename << "[-ps] [-isp=IDX] [-dsp=IDX]\n [-ir] [-imb=VAL] [-imc=VAL]" << endl << endl; |
|
||||||
cout << " -ps, print streams setting and profiles" << endl; |
|
||||||
cout << " -isp=IDX, set profile index of the image stream" << endl; |
|
||||||
cout << " -dsp=IDX, set profile index of the depth stream" << endl; |
|
||||||
cout << " -ir, show data from IR stream" << endl; |
|
||||||
cout << " -imb=VAL, set brightness value for an image stream" << endl; |
|
||||||
cout << " -imc=VAL, set contrast value for a image stream" << endl; |
|
||||||
cout << " -pts, print frame index and frame time" << endl; |
|
||||||
cout << " --show-closed, print frame index and frame time" << endl; |
|
||||||
cout << endl; |
|
||||||
} |
|
||||||
|
|
||||||
static void parseCMDLine(int argc, char* argv[]) |
|
||||||
{ |
|
||||||
cv::CommandLineParser parser(argc, argv, |
|
||||||
"{ h help | | }" |
|
||||||
"{ ps print-streams | | }" |
|
||||||
"{ isp image-stream-prof | -1 | }" |
|
||||||
"{ dsp depth-stream-prof | -1 | }" |
|
||||||
"{ir||}{imb||}{imc||}{pts||}{show-closed||}"); |
|
||||||
if (parser.has("h")) |
|
||||||
{ |
|
||||||
printUsage(argv[0]); |
|
||||||
exit(0); |
|
||||||
} |
|
||||||
g_printStreamSetting = parser.has("ps"); |
|
||||||
g_imageStreamProfileIdx = parser.get<int>("isp"); |
|
||||||
g_depthStreamProfileIdx = parser.get<int>("dsp"); |
|
||||||
g_irStreamShow = parser.has("ir"); |
|
||||||
if (parser.has("imb")) |
|
||||||
g_imageBrightness = parser.get<double>("imb"); |
|
||||||
else |
|
||||||
g_imageBrightness = -DBL_MAX; |
|
||||||
if (parser.has("imc")) |
|
||||||
g_imageContrast = parser.get<double>("imc"); |
|
||||||
else |
|
||||||
g_imageContrast = -DBL_MAX; |
|
||||||
g_printTiming = parser.has("pts"); |
|
||||||
g_showClosedPoint = parser.has("show-closed"); |
|
||||||
if (!parser.check()) |
|
||||||
{ |
|
||||||
parser.printErrors(); |
|
||||||
exit(-1); |
|
||||||
} |
|
||||||
if (g_showClosedPoint && (-1 == g_depthStreamProfileIdx)) |
|
||||||
{ |
|
||||||
cerr << "For --show-closed depth profile has be selected" << endl; |
|
||||||
exit(-1); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
static void printStreamProperties(VideoCapture &capture) |
|
||||||
{ |
|
||||||
size_t profilesCount = (size_t)capture.get(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_INTELPERC_PROFILE_COUNT); |
|
||||||
cout << "Image stream." << endl; |
|
||||||
cout << " Brightness = " << capture.get(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_BRIGHTNESS) << endl; |
|
||||||
cout << " Contrast = " << capture.get(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_CONTRAST) << endl; |
|
||||||
cout << " Saturation = " << capture.get(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_SATURATION) << endl; |
|
||||||
cout << " Hue = " << capture.get(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_HUE) << endl; |
|
||||||
cout << " Gamma = " << capture.get(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_GAMMA) << endl; |
|
||||||
cout << " Sharpness = " << capture.get(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_SHARPNESS) << endl; |
|
||||||
cout << " Gain = " << capture.get(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_GAIN) << endl; |
|
||||||
cout << " Backligh = " << capture.get(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_BACKLIGHT) << endl; |
|
||||||
cout << "Image streams profiles:" << endl; |
|
||||||
for (size_t i = 0; i < profilesCount; i++) |
|
||||||
{ |
|
||||||
capture.set(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_INTELPERC_PROFILE_IDX, (double)i); |
|
||||||
cout << " Profile[" << i << "]: "; |
|
||||||
cout << "width = " << |
|
||||||
(int)capture.get(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_FRAME_WIDTH); |
|
||||||
cout << ", height = " << |
|
||||||
(int)capture.get(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_FRAME_HEIGHT); |
|
||||||
cout << ", fps = " << |
|
||||||
capture.get(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_FPS); |
|
||||||
cout << endl; |
|
||||||
} |
|
||||||
|
|
||||||
profilesCount = (size_t)capture.get(CAP_INTELPERC_DEPTH_GENERATOR | CAP_PROP_INTELPERC_PROFILE_COUNT); |
|
||||||
cout << "Depth stream." << endl; |
|
||||||
cout << " Low confidence value = " << capture.get(CAP_INTELPERC_DEPTH_GENERATOR | CAP_PROP_INTELPERC_DEPTH_LOW_CONFIDENCE_VALUE) << endl; |
|
||||||
cout << " Saturation value = " << capture.get(CAP_INTELPERC_DEPTH_GENERATOR | CAP_PROP_INTELPERC_DEPTH_SATURATION_VALUE) << endl; |
|
||||||
cout << " Confidence threshold = " << capture.get(CAP_INTELPERC_DEPTH_GENERATOR | CAP_PROP_INTELPERC_DEPTH_CONFIDENCE_THRESHOLD) << endl; |
|
||||||
cout << " Focal length = (" << capture.get(CAP_INTELPERC_DEPTH_GENERATOR | CAP_PROP_INTELPERC_DEPTH_FOCAL_LENGTH_HORZ) << ", " |
|
||||||
<< capture.get(CAP_INTELPERC_DEPTH_GENERATOR | CAP_PROP_INTELPERC_DEPTH_FOCAL_LENGTH_VERT) << ")" << endl; |
|
||||||
cout << "Depth streams profiles:" << endl; |
|
||||||
for (size_t i = 0; i < profilesCount; i++) |
|
||||||
{ |
|
||||||
capture.set(CAP_INTELPERC_DEPTH_GENERATOR | CAP_PROP_INTELPERC_PROFILE_IDX, (double)i); |
|
||||||
cout << " Profile[" << i << "]: "; |
|
||||||
cout << "width = " << |
|
||||||
(int)capture.get(CAP_INTELPERC_DEPTH_GENERATOR | CAP_PROP_FRAME_WIDTH); |
|
||||||
cout << ", height = " << |
|
||||||
(int)capture.get(CAP_INTELPERC_DEPTH_GENERATOR | CAP_PROP_FRAME_HEIGHT); |
|
||||||
cout << ", fps = " << |
|
||||||
capture.get(CAP_INTELPERC_DEPTH_GENERATOR | CAP_PROP_FPS); |
|
||||||
cout << endl; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
static void imshowImage(const char *winname, Mat &image, VideoCapture &capture) |
|
||||||
{ |
|
||||||
if (g_showClosedPoint) |
|
||||||
{ |
|
||||||
Mat uvMap; |
|
||||||
if (capture.retrieve(uvMap, CAP_INTELPERC_UVDEPTH_MAP)) |
|
||||||
{ |
|
||||||
float *uvmap = (float *)uvMap.ptr() + 2 * (g_closedDepthPoint[0] * uvMap.cols + g_closedDepthPoint[1]); |
|
||||||
int x = (int)((*uvmap) * image.cols); uvmap++; |
|
||||||
int y = (int)((*uvmap) * image.rows); |
|
||||||
|
|
||||||
if ((0 <= x) && (0 <= y)) |
|
||||||
{ |
|
||||||
static const int pointSize = 4; |
|
||||||
for (int row = y; row < min(y + pointSize, image.rows); row++) |
|
||||||
{ |
|
||||||
uchar* ptrDst = image.ptr(row) + x * 3 + 2;//+2 -> Red
|
|
||||||
for (int col = 0; col < min(pointSize, image.cols - x); col++, ptrDst+=3) |
|
||||||
{ |
|
||||||
*ptrDst = 255; |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
imshow(winname, image); |
|
||||||
} |
|
||||||
static void imshowIR(const char *winname, Mat &ir) |
|
||||||
{ |
|
||||||
Mat image; |
|
||||||
if (g_showClosedPoint) |
|
||||||
{ |
|
||||||
image.create(ir.rows, ir.cols, CV_8UC3); |
|
||||||
for (int row = 0; row < ir.rows; row++) |
|
||||||
{ |
|
||||||
uchar* ptrDst = image.ptr(row); |
|
||||||
short* ptrSrc = (short*)ir.ptr(row); |
|
||||||
for (int col = 0; col < ir.cols; col++, ptrSrc++) |
|
||||||
{ |
|
||||||
uchar val = (uchar) ((*ptrSrc) >> 2); |
|
||||||
*ptrDst = val; ptrDst++; |
|
||||||
*ptrDst = val; ptrDst++; |
|
||||||
*ptrDst = val; ptrDst++; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
static const int pointSize = 4; |
|
||||||
for (int row = g_closedDepthPoint[0]; row < min(g_closedDepthPoint[0] + pointSize, image.rows); row++) |
|
||||||
{ |
|
||||||
uchar* ptrDst = image.ptr(row) + g_closedDepthPoint[1] * 3 + 2;//+2 -> Red
|
|
||||||
for (int col = 0; col < min(pointSize, image.cols - g_closedDepthPoint[1]); col++, ptrDst+=3) |
|
||||||
{ |
|
||||||
*ptrDst = 255; |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
else |
|
||||||
{ |
|
||||||
image.create(ir.rows, ir.cols, CV_8UC1); |
|
||||||
for (int row = 0; row < ir.rows; row++) |
|
||||||
{ |
|
||||||
uchar* ptrDst = image.ptr(row); |
|
||||||
short* ptrSrc = (short*)ir.ptr(row); |
|
||||||
for (int col = 0; col < ir.cols; col++, ptrSrc++, ptrDst++) |
|
||||||
{ |
|
||||||
*ptrDst = (uchar) ((*ptrSrc) >> 2); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
imshow(winname, image); |
|
||||||
} |
|
||||||
static void imshowDepth(const char *winname, Mat &depth, VideoCapture &capture) |
|
||||||
{ |
|
||||||
short lowValue = (short)capture.get(CAP_INTELPERC_DEPTH_GENERATOR | CAP_PROP_INTELPERC_DEPTH_LOW_CONFIDENCE_VALUE); |
|
||||||
short saturationValue = (short)capture.get(CAP_INTELPERC_DEPTH_GENERATOR | CAP_PROP_INTELPERC_DEPTH_SATURATION_VALUE); |
|
||||||
|
|
||||||
Mat image; |
|
||||||
if (g_showClosedPoint) |
|
||||||
{ |
|
||||||
image.create(depth.rows, depth.cols, CV_8UC3); |
|
||||||
for (int row = 0; row < depth.rows; row++) |
|
||||||
{ |
|
||||||
uchar* ptrDst = image.ptr(row); |
|
||||||
short* ptrSrc = (short*)depth.ptr(row); |
|
||||||
for (int col = 0; col < depth.cols; col++, ptrSrc++) |
|
||||||
{ |
|
||||||
if ((lowValue == (*ptrSrc)) || (saturationValue == (*ptrSrc))) |
|
||||||
{ |
|
||||||
*ptrDst = 0; ptrDst++; |
|
||||||
*ptrDst = 0; ptrDst++; |
|
||||||
*ptrDst = 0; ptrDst++; |
|
||||||
} |
|
||||||
else |
|
||||||
{ |
|
||||||
uchar val = (uchar) ((*ptrSrc) >> 2); |
|
||||||
*ptrDst = val; ptrDst++; |
|
||||||
*ptrDst = val; ptrDst++; |
|
||||||
*ptrDst = val; ptrDst++; |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
static const int pointSize = 4; |
|
||||||
for (int row = g_closedDepthPoint[0]; row < min(g_closedDepthPoint[0] + pointSize, image.rows); row++) |
|
||||||
{ |
|
||||||
uchar* ptrDst = image.ptr(row) + g_closedDepthPoint[1] * 3 + 2;//+2 -> Red
|
|
||||||
for (int col = 0; col < min(pointSize, image.cols - g_closedDepthPoint[1]); col++, ptrDst+=3) |
|
||||||
{ |
|
||||||
*ptrDst = 255; |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
else |
|
||||||
{ |
|
||||||
image.create(depth.rows, depth.cols, CV_8UC1); |
|
||||||
for (int row = 0; row < depth.rows; row++) |
|
||||||
{ |
|
||||||
uchar* ptrDst = image.ptr(row); |
|
||||||
short* ptrSrc = (short*)depth.ptr(row); |
|
||||||
for (int col = 0; col < depth.cols; col++, ptrSrc++, ptrDst++) |
|
||||||
{ |
|
||||||
if ((lowValue == (*ptrSrc)) || (saturationValue == (*ptrSrc))) |
|
||||||
*ptrDst = 0; |
|
||||||
else |
|
||||||
*ptrDst = (uchar) ((*ptrSrc) >> 2); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
imshow(winname, image); |
|
||||||
} |
|
||||||
|
|
||||||
int main(int argc, char* argv[]) |
|
||||||
{ |
|
||||||
parseCMDLine(argc, argv); |
|
||||||
|
|
||||||
VideoCapture capture; |
|
||||||
capture.open(CAP_INTELPERC); |
|
||||||
if (!capture.isOpened()) |
|
||||||
{ |
|
||||||
cerr << "Can not open a capture object." << endl; |
|
||||||
return -1; |
|
||||||
} |
|
||||||
|
|
||||||
if (g_printStreamSetting) |
|
||||||
printStreamProperties(capture); |
|
||||||
|
|
||||||
if (-1 != g_imageStreamProfileIdx) |
|
||||||
{ |
|
||||||
if (!capture.set(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_INTELPERC_PROFILE_IDX, (double)g_imageStreamProfileIdx)) |
|
||||||
{ |
|
||||||
cerr << "Can not setup a image stream." << endl; |
|
||||||
return -1; |
|
||||||
} |
|
||||||
} |
|
||||||
if (-1 != g_depthStreamProfileIdx) |
|
||||||
{ |
|
||||||
if (!capture.set(CAP_INTELPERC_DEPTH_GENERATOR | CAP_PROP_INTELPERC_PROFILE_IDX, (double)g_depthStreamProfileIdx)) |
|
||||||
{ |
|
||||||
cerr << "Can not setup a depth stream." << endl; |
|
||||||
return -1; |
|
||||||
} |
|
||||||
} |
|
||||||
else if (g_irStreamShow) |
|
||||||
{ |
|
||||||
if (!capture.set(CAP_INTELPERC_DEPTH_GENERATOR | CAP_PROP_INTELPERC_PROFILE_IDX, 0.0)) |
|
||||||
{ |
|
||||||
cerr << "Can not setup a IR stream." << endl; |
|
||||||
return -1; |
|
||||||
} |
|
||||||
} |
|
||||||
else |
|
||||||
{ |
|
||||||
cout << "Streams not selected" << endl; |
|
||||||
return 0; |
|
||||||
} |
|
||||||
|
|
||||||
//Setup additional properties only after set profile of the stream
|
|
||||||
if ( (-10000.0 < g_imageBrightness) && (g_imageBrightness < 10000.0)) |
|
||||||
capture.set(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_BRIGHTNESS, g_imageBrightness); |
|
||||||
if ( (0 < g_imageContrast) && (g_imageContrast < 10000.0)) |
|
||||||
capture.set(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_BRIGHTNESS, g_imageContrast); |
|
||||||
|
|
||||||
int frame = 0; |
|
||||||
for(;;frame++) |
|
||||||
{ |
|
||||||
Mat bgrImage; |
|
||||||
Mat depthImage; |
|
||||||
Mat irImage; |
|
||||||
|
|
||||||
if (!capture.grab()) |
|
||||||
{ |
|
||||||
cout << "Can not grab images." << endl; |
|
||||||
return -1; |
|
||||||
} |
|
||||||
|
|
||||||
if ((-1 != g_depthStreamProfileIdx) && (capture.retrieve(depthImage, CAP_INTELPERC_DEPTH_MAP))) |
|
||||||
{ |
|
||||||
if (g_showClosedPoint) |
|
||||||
{ |
|
||||||
double minVal = 0.0; double maxVal = 0.0; |
|
||||||
minMaxIdx(depthImage, &minVal, &maxVal, g_closedDepthPoint); |
|
||||||
} |
|
||||||
imshowDepth("depth image", depthImage, capture); |
|
||||||
} |
|
||||||
if ((g_irStreamShow) && (capture.retrieve(irImage, CAP_INTELPERC_IR_MAP))) |
|
||||||
imshowIR("ir image", irImage); |
|
||||||
if ((-1 != g_imageStreamProfileIdx) && (capture.retrieve(bgrImage, CAP_INTELPERC_IMAGE))) |
|
||||||
imshowImage("color image", bgrImage, capture); |
|
||||||
|
|
||||||
if (g_printTiming) |
|
||||||
{ |
|
||||||
cout << "Image frame: " << capture.get(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_POS_FRAMES) |
|
||||||
<< ", Depth(IR) frame: " << capture.get(CAP_INTELPERC_DEPTH_GENERATOR | CAP_PROP_POS_FRAMES) << endl; |
|
||||||
cout << "Image frame: " << capture.get(CAP_INTELPERC_IMAGE_GENERATOR | CAP_PROP_POS_MSEC) |
|
||||||
<< ", Depth(IR) frame: " << capture.get(CAP_INTELPERC_DEPTH_GENERATOR | CAP_PROP_POS_MSEC) << endl; |
|
||||||
} |
|
||||||
if( waitKey(30) >= 0 ) |
|
||||||
break; |
|
||||||
} |
|
||||||
|
|
||||||
return 0; |
|
||||||
} |
|
@ -0,0 +1,33 @@ |
|||||||
|
#include "opencv2/videoio.hpp" |
||||||
|
#include "opencv2/highgui.hpp" |
||||||
|
#include "opencv2/imgproc.hpp" |
||||||
|
|
||||||
|
using namespace cv; |
||||||
|
using namespace std; |
||||||
|
|
||||||
|
int main() |
||||||
|
{ |
||||||
|
VideoCapture capture(CAP_INTELPERC); |
||||||
|
for(;;) |
||||||
|
{ |
||||||
|
Mat depthMap; |
||||||
|
Mat image; |
||||||
|
Mat irImage; |
||||||
|
Mat adjMap; |
||||||
|
|
||||||
|
capture.grab(); |
||||||
|
capture.retrieve(depthMap,CAP_INTELPERC_DEPTH_MAP); |
||||||
|
capture.retrieve(image,CAP_INTELPERC_IMAGE); |
||||||
|
capture.retrieve(irImage,CAP_INTELPERC_IR_MAP); |
||||||
|
|
||||||
|
normalize(depthMap, adjMap, 0, 255, NORM_MINMAX, CV_8UC1); |
||||||
|
applyColorMap(adjMap, adjMap, COLORMAP_JET); |
||||||
|
|
||||||
|
imshow("RGB", image); |
||||||
|
imshow("IR", irImage); |
||||||
|
imshow("DEPTH", adjMap); |
||||||
|
if( waitKey( 30 ) >= 0 ) |
||||||
|
break; |
||||||
|
} |
||||||
|
return 0; |
||||||
|
} |
Loading…
Reference in new issue