image_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;
8 
11 constexpr auto ALIGN_SOCKET = LEFT_SOCKET;
12 
15 
16 class FPSCounter {
17  public:
18  void tick() {
19  auto now = std::chrono::steady_clock::now();
20  frameTimes.push(now);
21  if(frameTimes.size() > 100) {
22  frameTimes.pop();
23  }
24  }
25 
26  double getFps() {
27  if(frameTimes.size() <= 1) return 0;
28  auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(frameTimes.back() - frameTimes.front()).count();
29  return (frameTimes.size() - 1) * 1000.0 / duration;
30  }
31 
32  private:
33  std::queue<std::chrono::steady_clock::time_point> frameTimes;
34 };
35 
36 double rgbWeight = 0.4;
37 double leftWeight = 0.6;
39 
40 void updateBlendWeights(int percentRgb, void*) {
41  rgbWeight = static_cast<double>(percentRgb) / 100.0;
42  leftWeight = 1.0 - rgbWeight;
43 }
44 
45 void updateDepthPlane(int depth, void*) {
46  staticDepthPlane = depth;
47 }
48 
49 int main() {
50  dai::Pipeline pipeline;
51 
52  auto camRgb = pipeline.create<dai::node::ColorCamera>();
53  auto left = pipeline.create<dai::node::MonoCamera>();
54  auto sync = pipeline.create<dai::node::Sync>();
55  auto out = pipeline.create<dai::node::XLinkOut>();
56  auto align = pipeline.create<dai::node::ImageAlign>();
57  auto cfgIn = pipeline.create<dai::node::XLinkIn>();
58 
61  left->setFps(FPS);
62 
63  camRgb->setBoardSocket(RGB_SOCKET);
64  camRgb->setResolution(COLOR_RESOLUTION);
65  camRgb->setFps(FPS);
66  camRgb->setIspScale(1, 3);
67 
68  out->setStreamName("out");
69 
70  sync->setSyncThreshold(std::chrono::milliseconds(static_cast<int>((1 / FPS) * 1000.0 * 0.5)));
71 
72  cfgIn->setStreamName("config");
73 
74  align->outputAligned.link(sync->inputs["aligned"]);
75  camRgb->isp.link(sync->inputs["rgb"]);
76  camRgb->isp.link(align->inputAlignTo);
77  left->out.link(align->input);
78  sync->out.link(out->input);
79  cfgIn->out.link(align->inputConfig);
80 
81  dai::Device device(pipeline);
82  auto queue = device.getOutputQueue("out", 8, false);
83  auto cfgQ = device.getInputQueue("config");
84 
85  FPSCounter fpsCounter;
86 
87  std::string windowName = "rgb-left";
88  cv::namedWindow(windowName, cv::WINDOW_NORMAL);
89  cv::resizeWindow(windowName, 1280, 720);
90  cv::createTrackbar("RGB Weight %", windowName, nullptr, 100, updateBlendWeights);
91  cv::createTrackbar("Static Depth Plane [mm]", windowName, nullptr, 2000, updateDepthPlane);
92 
93  while(true) {
94  auto messageGroup = queue->get<dai::MessageGroup>();
95  fpsCounter.tick();
96 
97  auto frameRgb = messageGroup->get<dai::ImgFrame>("rgb");
98  auto leftAligned = messageGroup->get<dai::ImgFrame>("aligned");
99 
100  if(frameRgb && leftAligned) {
101  auto frameRgbCv = frameRgb->getCvFrame();
102  auto leftCv = leftAligned->getCvFrame();
103 
104  if(leftCv.channels() == 1) {
105  cv::cvtColor(leftCv, leftCv, cv::COLOR_GRAY2BGR);
106  }
107  if(leftCv.size() != frameRgbCv.size()) {
108  cv::resize(leftCv, leftCv, frameRgbCv.size());
109  }
110 
111  cv::Mat blended;
112  cv::addWeighted(frameRgbCv, rgbWeight, leftCv, leftWeight, 0, blended);
113  cv::imshow(windowName, blended);
114  }
115 
116  int key = cv::waitKey(1);
117  if(key == 'q' || key == 'Q') {
118  break;
119  }
120 
121  auto cfg = align->initialConfig.get();
122  cfg.staticDepthPlane = staticDepthPlane;
123  auto alignConfig = std::make_shared<dai::ImageAlignConfig>();
124  alignConfig->set(cfg);
125  cfgQ->send(alignConfig);
126  }
127 
128  return 0;
129 }
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::ColorCamera::setResolution
void setResolution(Properties::SensorResolution resolution)
Set sensor resolution.
Definition: ColorCamera.cpp:169
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: image_align.cpp:40
dai::CameraBoardSocket::CAM_A
@ CAM_A
updateDepthPlane
void updateDepthPlane(int depth, void *)
Definition: image_align.cpp:45
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
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
main
int main()
Definition: image_align.cpp:49
COLOR_RESOLUTION
constexpr auto COLOR_RESOLUTION
Definition: image_align.cpp:13
dai::MonoCameraProperties::SensorResolution::THE_720_P
@ THE_720_P
LEFT_SOCKET
constexpr auto LEFT_SOCKET
Definition: image_align.cpp:10
dai::node::XLinkOut::input
Input input
Definition: XLinkOut.hpp:27
depthai.hpp
FPSCounter::getFps
double getFps()
Definition: image_align.cpp:26
dai::Pipeline::create
std::shared_ptr< N > create()
Definition: Pipeline.hpp:145
FPSCounter::tick
void tick()
Definition: image_align.cpp:18
rgbWeight
double rgbWeight
Definition: image_align.cpp:36
staticDepthPlane
int staticDepthPlane
Definition: image_align.cpp:38
ALIGN_SOCKET
constexpr auto ALIGN_SOCKET
Definition: image_align.cpp:11
dai::node::ColorCamera::setBoardSocket
void setBoardSocket(CameraBoardSocket boardSocket)
Definition: ColorCamera.cpp:35
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
LEFT_RIGHT_RESOLUTION
constexpr auto LEFT_RIGHT_RESOLUTION
Definition: image_align.cpp:14
FPS
constexpr auto FPS
Definition: image_align.cpp:7
dai::ColorCameraProperties::SensorResolution::THE_1080_P
@ THE_1080_P
1920 × 1080
dai::Device
Definition: Device.hpp:21
RGB_SOCKET
constexpr auto RGB_SOCKET
Definition: image_align.cpp:9
dai::node::XLinkIn
XLinkIn node. Receives messages over XLink.
Definition: XLinkIn.hpp:14
dai::Device::getInputQueue
std::shared_ptr< DataInputQueue > getInputQueue(const std::string &name)
Definition: Device.cpp:120
dai::Node::Output::link
void link(const Input &in)
Definition: Node.cpp:84
leftWeight
double leftWeight
Definition: image_align.cpp:37


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