| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- /**
- * attention: Astra2 cameras currently only support Windows and Linux kernel versions no higher than 4.15, and higher versions of Linux kernel may have exceptions.
- */
- #include <opencv2/videoio.hpp>
- #include <opencv2/highgui.hpp>
- #include <opencv2/imgproc.hpp>
- #include <iostream>
- using namespace cv;
- int main(int argc, char** argv)
- {
- cv::CommandLineParser parser(argc, argv,
- "{help h ? | | help message}"
- "{dw | | depth width }"
- "{dh | | depth height }"
- "{df | | depth fps }"
- "{cw | | color width }"
- "{ch | | color height }"
- "{cf | | depth fps }"
- );
- if (parser.has("help"))
- {
- parser.printMessage();
- return 0;
- }
- std::vector<int> params;
- if (parser.has("dw"))
- {
- params.push_back(CAP_PROP_OBSENSOR_DEPTH_WIDTH);
- params.push_back(parser.get<int>("dw"));
- }
- if (parser.has("dh"))
- {
- params.push_back(CAP_PROP_OBSENSOR_DEPTH_HEIGHT);
- params.push_back(parser.get<int>("dh"));
- }
- if (parser.has("df"))
- {
- params.push_back(CAP_PROP_OBSENSOR_DEPTH_FPS);
- params.push_back(parser.get<int>("df"));
- }
- if (parser.has("cw"))
- {
- params.push_back(CAP_PROP_FRAME_WIDTH);
- params.push_back(parser.get<int>("cw"));
- }
- if (parser.has("ch"))
- {
- params.push_back(CAP_PROP_FRAME_HEIGHT);
- params.push_back(parser.get<int>("ch"));
- }
- if (parser.has("cf"))
- {
- params.push_back(CAP_PROP_FPS);
- params.push_back(parser.get<int>("cf"));
- }
- VideoCapture obsensorCapture;
- if (params.empty())
- obsensorCapture.open(0, CAP_OBSENSOR);
- else
- obsensorCapture.open(0, CAP_OBSENSOR, params);
- if(!obsensorCapture.isOpened()) {
- std::cerr << "Failed to open obsensor capture! Index out of range or no response from device";
- return -1;
- }
- double fx = obsensorCapture.get(CAP_PROP_OBSENSOR_INTRINSIC_FX);
- double fy = obsensorCapture.get(CAP_PROP_OBSENSOR_INTRINSIC_FY);
- double cx = obsensorCapture.get(CAP_PROP_OBSENSOR_INTRINSIC_CX);
- double cy = obsensorCapture.get(CAP_PROP_OBSENSOR_INTRINSIC_CY);
- double k1 = obsensorCapture.get(CAP_PROP_OBSENSOR_COLOR_DISTORTION_K1);
- double k2 = obsensorCapture.get(CAP_PROP_OBSENSOR_COLOR_DISTORTION_K2);
- double k3 = obsensorCapture.get(CAP_PROP_OBSENSOR_COLOR_DISTORTION_K3);
- double k4 = obsensorCapture.get(CAP_PROP_OBSENSOR_COLOR_DISTORTION_K4);
- double k5 = obsensorCapture.get(CAP_PROP_OBSENSOR_COLOR_DISTORTION_K5);
- double k6 = obsensorCapture.get(CAP_PROP_OBSENSOR_COLOR_DISTORTION_K6);
- double p1 = obsensorCapture.get(CAP_PROP_OBSENSOR_COLOR_DISTORTION_P1);
- double p2 = obsensorCapture.get(CAP_PROP_OBSENSOR_COLOR_DISTORTION_P1);
- std::cout << "obsensor camera intrinsic params: fx=" << fx << ", fy=" << fy << ", cx=" << cx << ", cy=" << cy << std::endl;
- std::cout << "obsensor camera distortion params: k,p=" << k1 << ", " << k2 << ", " << k3 << ", "
- << k4 << ", " << k5 << ", " << k6 << ", "
- << p1 << ", " << p2 << std::endl;
- Mat image;
- Mat depthMap;
- Mat adjDepthMap;
- // Minimum depth value
- const double minVal = 300;
- // Maximum depth value
- const double maxVal = 5000;
- while (true)
- {
- // Grab depth map like this:
- // obsensorCapture >> depthMap;
- // Another way to grab depth map (and bgr image).
- if (obsensorCapture.grab())
- {
- if (obsensorCapture.retrieve(image, CAP_OBSENSOR_BGR_IMAGE))
- {
- imshow("RGB", image);
- }
- if (obsensorCapture.retrieve(depthMap, CAP_OBSENSOR_DEPTH_MAP))
- {
- depthMap.convertTo(adjDepthMap, CV_8U, 255.0 / (maxVal - minVal), -minVal * 255.0 / (maxVal - minVal));
- applyColorMap(adjDepthMap, adjDepthMap, COLORMAP_JET);
- imshow("DEPTH", adjDepthMap);
- }
- // depth map overlay on bgr image
- static const float alpha = 0.6f;
- if (!image.empty() && !depthMap.empty())
- {
- depthMap.convertTo(adjDepthMap, CV_8U, 255.0 / (maxVal - minVal), -minVal * 255.0 / (maxVal - minVal));
- cv::resize(adjDepthMap, adjDepthMap, cv::Size(image.cols, image.rows));
- for (int i = 0; i < image.rows; i++)
- {
- for (int j = 0; j < image.cols; j++)
- {
- cv::Vec3b& outRgb = image.at<cv::Vec3b>(i, j);
- uint8_t depthValue = 255 - adjDepthMap.at<uint8_t>(i, j);
- if (depthValue != 0 && depthValue != 255)
- {
- outRgb[0] = (uint8_t)(outRgb[0] * (1.0f - alpha) + depthValue * alpha);
- outRgb[1] = (uint8_t)(outRgb[1] * (1.0f - alpha) + depthValue * alpha);
- outRgb[2] = (uint8_t)(outRgb[2] * (1.0f - alpha) + depthValue * alpha);
- }
- }
- }
- imshow("DepthToColor", image);
- }
- image.release();
- depthMap.release();
- }
- if (pollKey() >= 0)
- break;
- }
- return 0;
- }
|