tof_align.cpp
Go to the documentation of this file.
1 #include <opencv2/opencv.hpp>
2 
3 #include "depthai/depthai.hpp"
4 
5 constexpr auto FPS = 30.0;
6 
9 constexpr auto ALIGN_SOCKET = RGB_SOCKET;
10 
11 class FPSCounter {
12  public:
13  void tick() {
14  auto now = std::chrono::steady_clock::now();
15  frameTimes.push(now);
16  if(frameTimes.size() > 100) {
17  frameTimes.pop();
18  }
19  }
20 
21  double getFps() {
22  if(frameTimes.size() <= 1) return 0;
23  auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(frameTimes.back() - frameTimes.front()).count();
24  return (frameTimes.size() - 1) * 1000.0 / duration;
25  }
26 
27  private:
28  std::queue<std::chrono::steady_clock::time_point> frameTimes;
29 };
30 
31 cv::Mat colorizeDepth(const cv::Mat& frameDepth) {
32  cv::Mat invalidMask = (frameDepth == 0);
33  cv::Mat depthFrameColor;
34  try {
35  double minDepth = 0.0;
36  double maxDepth = 0.0;
37  cv::minMaxIdx(frameDepth, &minDepth, &maxDepth, nullptr, nullptr, ~invalidMask);
38  if(minDepth == maxDepth) {
39  depthFrameColor = cv::Mat::zeros(frameDepth.size(), CV_8UC3);
40  return depthFrameColor;
41  }
42  cv::Mat logDepth;
43  frameDepth.convertTo(logDepth, CV_32F);
44  cv::log(logDepth, logDepth);
45  logDepth.setTo(log(minDepth), invalidMask);
46  cv::normalize(logDepth, logDepth, 0, 255, cv::NORM_MINMAX, CV_8UC1);
47  cv::applyColorMap(logDepth, depthFrameColor, cv::COLORMAP_JET);
48  depthFrameColor.setTo(cv::Scalar(0, 0, 0), invalidMask);
49  } catch(const std::exception& e) {
50  depthFrameColor = cv::Mat::zeros(frameDepth.size(), CV_8UC3);
51  }
52  return depthFrameColor;
53 }
54 
55 double rgbWeight = 0.4;
56 double depthWeight = 0.6;
57 
58 void updateBlendWeights(int percentRgb, void*) {
59  rgbWeight = static_cast<double>(percentRgb) / 100.0;
60  depthWeight = 1.0 - rgbWeight;
61 }
62 
63 int main() {
64  dai::Pipeline pipeline;
65 
66  auto camRgb = pipeline.create<dai::node::ColorCamera>();
67  auto camTof = pipeline.create<dai::node::Camera>();
68  auto tof = pipeline.create<dai::node::ToF>();
69  auto sync = pipeline.create<dai::node::Sync>();
70  auto align = pipeline.create<dai::node::ImageAlign>();
71  auto xout = pipeline.create<dai::node::XLinkOut>();
72 
73  camTof->setFps(FPS);
75  camTof->setBoardSocket(TOF_SOCKET);
76 
77  camRgb->setBoardSocket(RGB_SOCKET);
79  camRgb->setFps(FPS);
80  camRgb->setIspScale(1, 2);
81 
82  xout->setStreamName("out");
83 
84  sync->setSyncThreshold(std::chrono::milliseconds(static_cast<int>(1000 / FPS)));
85 
86  camRgb->isp.link(sync->inputs["rgb"]);
87  camTof->raw.link(tof->input);
88  tof->depth.link(align->input);
89  align->outputAligned.link(sync->inputs["depth_aligned"]);
90  camRgb->isp.link(align->inputAlignTo);
91  sync->out.link(xout->input);
92 
93  dai::Device device(pipeline);
94  auto queue = device.getOutputQueue("out", 8, false);
95 
96  FPSCounter fpsCounter;
97 
98  std::string rgbDepthWindowName = "rgb-depth";
99  cv::namedWindow(rgbDepthWindowName);
100  cv::createTrackbar("RGB Weight %", rgbDepthWindowName, nullptr, 100, updateBlendWeights);
101 
102  while(true) {
103  auto messageGroup = queue->get<dai::MessageGroup>();
104  fpsCounter.tick();
105 
106  auto frameRgb = messageGroup->get<dai::ImgFrame>("rgb");
107  auto frameDepth = messageGroup->get<dai::ImgFrame>("depth_aligned");
108 
109  if(frameRgb && frameDepth) {
110  auto cvFrame = frameRgb->getCvFrame();
111  auto alignedDepthColorized = colorizeDepth(frameDepth->getFrame());
112 
113  cv::putText(alignedDepthColorized,
114  "FPS: " + std::to_string(fpsCounter.getFps()),
115  cv::Point(10, 30),
116  cv::FONT_HERSHEY_SIMPLEX,
117  1,
118  cv::Scalar(255, 255, 255),
119  2);
120 
121  cv::imshow("depth", alignedDepthColorized);
122 
123  cv::Mat blended;
124  cv::addWeighted(cvFrame, rgbWeight, alignedDepthColorized, depthWeight, 0, blended);
125  cv::imshow(rgbDepthWindowName, blended);
126  }
127 
128  int key = cv::waitKey(1);
129  if(key == 'q' || key == 'Q') {
130  break;
131  }
132  }
133 
134  return 0;
135 }
dai::node::XLinkOut
XLinkOut node. Sends messages over XLink.
Definition: XLinkOut.hpp:14
depthWeight
double depthWeight
Definition: tof_align.cpp:56
dai::Pipeline
Represents the pipeline, set of nodes and connections between them.
Definition: Pipeline.hpp:100
dai::ImgFrame::getFrame
void getFrame(T...)
Definition: ImgFrame.hpp:218
TOF_SOCKET
constexpr auto TOF_SOCKET
Definition: tof_align.cpp:8
dai::MessageGroup
Definition: MessageGroup.hpp:16
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
updateBlendWeights
void updateBlendWeights(int percentRgb, void *)
Definition: tof_align.cpp:58
dai::CameraBoardSocket::CAM_A
@ CAM_A
dai::node::ImageAlign::input
Input input
Definition: ImageAlign.hpp:45
colorizeDepth
cv::Mat colorizeDepth(const cv::Mat &frameDepth)
Definition: tof_align.cpp:31
dai::node::ColorCamera
ColorCamera node. For use with color sensors.
Definition: ColorCamera.hpp:16
rgbWeight
double rgbWeight
Definition: tof_align.cpp:55
dai::node::ColorCamera::raw
Output raw
Definition: ColorCamera.hpp:90
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::ColorCameraProperties::SensorResolution::THE_800_P
@ THE_800_P
1280 × 800
depthai.hpp
FPSCounter::getFps
double getFps()
Definition: tof_align.cpp:21
dai::Pipeline::create
std::shared_ptr< N > create()
Definition: Pipeline.hpp:145
FPSCounter::tick
void tick()
Definition: tof_align.cpp:13
main
int main()
Definition: tof_align.cpp:63
dai::node::ColorCamera::setBoardSocket
void setBoardSocket(CameraBoardSocket boardSocket)
Definition: ColorCamera.cpp:35
dai::node::ColorCamera::setImageOrientation
void setImageOrientation(CameraImageOrientation imageOrientation)
Set camera image orientation.
Definition: ColorCamera.cpp:80
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
dai::CameraImageOrientation::ROTATE_180_DEG
@ ROTATE_180_DEG
nanorpc::core::exception::to_string
std::string to_string(std::exception const &e)
Definition: exception.h:46
RGB_SOCKET
constexpr auto RGB_SOCKET
Definition: tof_align.cpp:7
FPS
constexpr auto FPS
Definition: tof_align.cpp:5
ALIGN_SOCKET
constexpr auto ALIGN_SOCKET
Definition: tof_align.cpp:9
dai::Device
Definition: Device.hpp:21
dai::node::Camera
Camera node. Experimental node, for both mono and color types of sensors.
Definition: Camera.hpp:18
dai::node::ToF
ToF node.
Definition: ToF.hpp:16


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