depth_align.cpp
Go to the documentation of this file.
1 #include <chrono>
2 #include <opencv2/opencv.hpp>
3 #include <queue>
4 
5 #include "depthai/depthai.hpp"
6 
7 constexpr auto FPS = 30.0;
11 constexpr auto ALIGN_SOCKET = LEFT_SOCKET;
12 
15 constexpr auto ISP_SCALE = 3;
16 
17 class FPSCounter {
18  public:
19  void tick() {
20  auto now = std::chrono::steady_clock::now();
21  frameTimes.push(now);
22  if(frameTimes.size() > 10) {
23  frameTimes.pop();
24  }
25  }
26 
27  double getFps() {
28  if(frameTimes.size() <= 1) return 0;
29  auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(frameTimes.back() - frameTimes.front()).count();
30  return (frameTimes.size() - 1) * 1000.0 / duration;
31  }
32 
33  private:
34  std::queue<std::chrono::steady_clock::time_point> frameTimes;
35 };
36 
37 double rgbWeight = 0.4;
38 double depthWeight = 0.6;
39 
40 void updateBlendWeights(int percentRgb, void*) {
41  rgbWeight = static_cast<double>(percentRgb) / 100.0;
42  depthWeight = 1.0 - rgbWeight;
43 }
44 
45 cv::Mat colorizeDepth(const cv::Mat& frameDepth) {
46  cv::Mat invalidMask = (frameDepth == 0);
47  cv::Mat depthFrameColor;
48  try {
49  double minDepth = 0.0;
50  double maxDepth = 0.0;
51  cv::minMaxIdx(frameDepth, &minDepth, &maxDepth, nullptr, nullptr, ~invalidMask);
52  if(minDepth == maxDepth) {
53  depthFrameColor = cv::Mat::zeros(frameDepth.size(), CV_8UC3);
54  return depthFrameColor;
55  }
56  cv::Mat logDepth;
57  frameDepth.convertTo(logDepth, CV_32F);
58  cv::log(logDepth, logDepth);
59  logDepth.setTo(log(minDepth), invalidMask);
60  cv::normalize(logDepth, logDepth, 0, 255, cv::NORM_MINMAX, CV_8UC1);
61  cv::applyColorMap(logDepth, depthFrameColor, cv::COLORMAP_JET);
62  depthFrameColor.setTo(cv::Scalar(0, 0, 0), invalidMask);
63  } catch(const std::exception& e) {
64  depthFrameColor = cv::Mat::zeros(frameDepth.size(), CV_8UC3);
65  }
66  return depthFrameColor;
67 }
68 
69 int main() {
70  dai::Pipeline pipeline;
71 
72  // Define sources and outputs
73  auto camRgb = pipeline.create<dai::node::ColorCamera>();
74  auto left = pipeline.create<dai::node::MonoCamera>();
75  auto right = pipeline.create<dai::node::MonoCamera>();
76  auto stereo = pipeline.create<dai::node::StereoDepth>();
77  auto sync = pipeline.create<dai::node::Sync>();
78  auto out = pipeline.create<dai::node::XLinkOut>();
79  auto align = pipeline.create<dai::node::ImageAlign>();
80 
83  left->setFps(FPS);
84 
87  right->setFps(FPS);
88 
89  camRgb->setBoardSocket(RGB_SOCKET);
90  camRgb->setResolution(COLOR_RESOLUTION);
91  camRgb->setFps(FPS);
92  camRgb->setIspScale(1, ISP_SCALE);
93 
94  stereo->setDefaultProfilePreset(dai::node::StereoDepth::PresetMode::HIGH_DENSITY);
95  stereo->setDepthAlign(LEFT_SOCKET);
96 
97  out->setStreamName("out");
98 
99  sync->setSyncThreshold(std::chrono::milliseconds(static_cast<int>((1 / FPS) * 1000.0 * 0.5)));
100 
101  // Linking
102  camRgb->isp.link(sync->inputs["rgb"]);
103  left->out.link(stereo->left);
104  right->out.link(stereo->right);
105  stereo->depth.link(align->input);
106  align->outputAligned.link(sync->inputs["depth_aligned"]);
107  camRgb->isp.link(align->inputAlignTo);
108  sync->out.link(out->input);
109 
110  dai::Device device(pipeline);
111  auto queue = device.getOutputQueue("out", 8, false);
112 
113  FPSCounter fpsCounter;
114 
115  std::string windowName = "rgb-depth";
116  cv::namedWindow(windowName, cv::WINDOW_NORMAL);
117  cv::resizeWindow(windowName, 1280, 720);
118  cv::createTrackbar("RGB Weight %", windowName, nullptr, 100, updateBlendWeights);
119 
120  while(true) {
121  auto messageGroup = queue->get<dai::MessageGroup>();
122  fpsCounter.tick();
123 
124  auto frameRgb = messageGroup->get<dai::ImgFrame>("rgb");
125  auto frameDepth = messageGroup->get<dai::ImgFrame>("depth_aligned");
126 
127  if(frameRgb && frameDepth) {
128  auto cvFrame = frameRgb->getCvFrame();
129 
130  // Colorize the aligned depth
131  auto alignedDepthColorized = colorizeDepth(frameDepth->getCvFrame());
132 
133  cv::imshow("Depth aligned", alignedDepthColorized);
134 
135  cv::Mat blended;
136  cv::addWeighted(cvFrame, rgbWeight, alignedDepthColorized, depthWeight, 0, blended);
137  cv::putText(blended, "FPS: " + std::to_string(fpsCounter.getFps()), cv::Point(10, 30), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255, 255, 255), 2);
138  cv::imshow(windowName, blended);
139  }
140 
141  int key = cv::waitKey(1);
142  if(key == 'q' || key == 'Q') {
143  break;
144  }
145  }
146 
147  return 0;
148 }
dai::node::MonoCamera::out
Output out
Definition: MonoCamera.hpp:47
dai::node::XLinkOut
XLinkOut node. Sends messages over XLink.
Definition: XLinkOut.hpp:14
dai::Pipeline
Represents the pipeline, set of nodes and connections between them.
Definition: Pipeline.hpp:100
dai::node::MonoCamera::setFps
void setFps(float fps)
Definition: MonoCamera.cpp:98
dai::node::ColorCamera::setResolution
void setResolution(Properties::SensorResolution resolution)
Set sensor resolution.
Definition: ColorCamera.cpp:169
dai::MessageGroup
Definition: MessageGroup.hpp:16
FPS
constexpr auto FPS
Definition: depth_align.cpp:7
dai::node::StereoDepth
StereoDepth node. Compute stereo disparity and depth from left-right image pair.
Definition: StereoDepth.hpp:15
FPSCounter::frameTimes
std::queue< std::chrono::steady_clock::time_point > frameTimes
Definition: depth_align.cpp:34
dai::node::Sync
Definition: Sync.hpp:11
dai::node::ColorCamera::setFps
void setFps(float fps)
Definition: ColorCamera.cpp:176
ISP_SCALE
constexpr auto ISP_SCALE
Definition: depth_align.cpp:15
dai::CameraBoardSocket::CAM_A
@ CAM_A
dai::node::MonoCamera
MonoCamera node. For use with grayscale sensors.
Definition: MonoCamera.hpp:17
dai::node::ColorCamera
ColorCamera node. For use with color sensors.
Definition: ColorCamera.hpp:16
dai::logger::log
void log(spdlog::source_loc source, spdlog::level::level_enum lvl, const FormatString &fmt, Args &&...args)
Definition: Logging.hpp:54
FPSCounter
Definition: depth_align.cpp:17
dai::CameraBoardSocket::CAM_B
@ CAM_B
dai::Device::getOutputQueue
std::shared_ptr< DataOutputQueue > getOutputQueue(const std::string &name)
Definition: Device.cpp:86
dai::MonoCameraProperties::SensorResolution::THE_400_P
@ THE_400_P
depthWeight
double depthWeight
Definition: depth_align.cpp:38
main
int main()
Definition: depth_align.cpp:69
dai::node::XLinkOut::input
Input input
Definition: XLinkOut.hpp:27
LEFT_RIGHT_RESOLUTION
constexpr auto LEFT_RIGHT_RESOLUTION
Definition: depth_align.cpp:14
depthai.hpp
RGB_SOCKET
constexpr auto RGB_SOCKET
Definition: depth_align.cpp:8
FPSCounter::getFps
double getFps()
Definition: depth_align.cpp:27
COLOR_RESOLUTION
constexpr auto COLOR_RESOLUTION
Definition: depth_align.cpp:13
dai::Pipeline::create
std::shared_ptr< N > create()
Definition: Pipeline.hpp:145
FPSCounter::tick
void tick()
Definition: depth_align.cpp:19
dai::node::ColorCamera::setBoardSocket
void setBoardSocket(CameraBoardSocket boardSocket)
Definition: ColorCamera.cpp:35
RIGHT_SOCKET
constexpr auto RIGHT_SOCKET
Definition: depth_align.cpp:10
dai::node::MonoCamera::setResolution
void setResolution(Properties::SensorResolution resolution)
Set sensor resolution.
Definition: MonoCamera.cpp:82
dai::CameraBoardSocket::CAM_C
@ CAM_C
LEFT_SOCKET
constexpr auto LEFT_SOCKET
Definition: depth_align.cpp:9
dai::ImgFrame::getCvFrame
void getCvFrame(T...)
Definition: ImgFrame.hpp:222
dai::node::ImageAlign
ImageAlign node. Calculates spatial location data on a set of ROIs on depth map.
Definition: ImageAlign.hpp:16
dai::ImgFrame
Definition: ImgFrame.hpp:25
nanorpc::core::exception::to_string
std::string to_string(std::exception const &e)
Definition: exception.h:46
updateBlendWeights
void updateBlendWeights(int percentRgb, void *)
Definition: depth_align.cpp:40
dai::ColorCameraProperties::SensorResolution::THE_1080_P
@ THE_1080_P
1920 × 1080
dai::node::StereoDepth::PresetMode::HIGH_DENSITY
@ HIGH_DENSITY
dai::Device
Definition: Device.hpp:21
ALIGN_SOCKET
constexpr auto ALIGN_SOCKET
Definition: depth_align.cpp:11
colorizeDepth
cv::Mat colorizeDepth(const cv::Mat &frameDepth)
Definition: depth_align.cpp:45
dai::Node::Output::link
void link(const Input &in)
Definition: Node.cpp:84
dai::node::MonoCamera::setBoardSocket
void setBoardSocket(CameraBoardSocket boardSocket)
Definition: MonoCamera.cpp:27
rgbWeight
double rgbWeight
Definition: depth_align.cpp:37


depthai
Author(s): Martin Peterlin
autogenerated on Sat Mar 22 2025 02:58:19