opencv/ImgFrame.cpp
Go to the documentation of this file.
2 
3 #include <cmath>
4 
5 // #include "spdlog/spdlog.h"
6 
7 namespace dai {
8 
9 ImgFrame& ImgFrame::setFrame(cv::Mat frame) {
10  img.data.clear();
11  img.data.insert(img.data.begin(), frame.datastart, frame.dataend);
12  return *this;
13 }
14 
15 cv::Mat ImgFrame::getFrame(bool deepCopy) {
16  // Convert to cv::Mat. If deepCopy enabled, then copy pixel data, otherwise reference only
17  cv::Mat mat;
18  cv::Size size = {0, 0};
19  int type = 0;
20 
21  switch(getType()) {
22  case Type::RGB888i:
23  case Type::BGR888i:
24  case Type::BGR888p:
25  case Type::RGB888p:
26  size = cv::Size(getWidth(), getHeight());
27  type = CV_8UC3;
28  break;
29 
30  case Type::YUV420p:
31  case Type::NV12:
32  case Type::NV21:
33  size = cv::Size(getWidth(), getHeight() * 3 / 2);
34  type = CV_8UC1;
35  break;
36 
37  case Type::RAW8:
38  case Type::GRAY8:
39  size = cv::Size(getWidth(), getHeight());
40  type = CV_8UC1;
41  break;
42 
43  case Type::GRAYF16:
44  size = cv::Size(getWidth(), getHeight());
45  type = CV_16FC1;
46  break;
47 
48  case Type::RAW16:
49  case Type::RAW14:
50  case Type::RAW12:
51  case Type::RAW10:
52  size = cv::Size(getWidth(), getHeight());
53  type = CV_16UC1;
54  break;
55 
60  size = cv::Size(getWidth(), getHeight());
61  type = CV_16FC3;
62  break;
63 
65  default:
66  size = cv::Size(static_cast<int>(getData().size()), 1);
67  type = CV_8UC1;
68  break;
69  }
70 
71  // Check if enough data
72  long requiredSize = CV_ELEM_SIZE(type) * size.area();
73  long actualSize = static_cast<long>(img.data.size());
74  if(actualSize < requiredSize) {
75  throw std::runtime_error("ImgFrame doesn't have enough data to encode specified frame, required " + std::to_string(requiredSize) + ", actual "
76  + std::to_string(actualSize) + ". Maybe metadataOnly transfer was made?");
77  } else if(actualSize > requiredSize) {
78  // FIXME doesn't build on Windows (multiple definitions during link)
79  // logger::warn("ImgFrame has excess data: actual {}, expected {}", actualSize, requiredSize);
80  }
81  if(getWidth() <= 0 || getHeight() <= 0) {
82  throw std::runtime_error("ImgFrame metadata not valid (width or height = 0)");
83  }
84 
85  // Copy or reference to existing data
86  if(deepCopy) {
87  // Create new image data
88  mat.create(size, type);
89  // Copy number of bytes that are available by Mat space or by img data size
90  std::memcpy(mat.data, img.data.data(), std::min((long)(img.data.size()), (long)(mat.dataend - mat.datastart)));
91  } else {
92  mat = cv::Mat(size, type, img.data.data());
93  }
94 
95  return mat;
96 }
97 
98 cv::Mat ImgFrame::getCvFrame() {
99  cv::Mat frame = getFrame();
100  cv::Mat output;
101 
102  switch(getType()) {
103  case Type::RGB888i:
104  cv::cvtColor(frame, output, cv::ColorConversionCodes::COLOR_RGB2BGR);
105  break;
106 
107  case Type::BGR888i:
108  output = frame.clone();
109  break;
110 
111  case Type::RGB888p: {
112  cv::Size s(getWidth(), getHeight());
113  std::vector<cv::Mat> channels;
114  // RGB
115  channels.push_back(cv::Mat(s, CV_8UC1, getData().data() + s.area() * 2));
116  channels.push_back(cv::Mat(s, CV_8UC1, getData().data() + s.area() * 1));
117  channels.push_back(cv::Mat(s, CV_8UC1, getData().data() + s.area() * 0));
118  cv::merge(channels, output);
119  } break;
120 
121  case Type::BGR888p: {
122  cv::Size s(getWidth(), getHeight());
123  std::vector<cv::Mat> channels;
124  // BGR
125  channels.push_back(cv::Mat(s, CV_8UC1, getData().data() + s.area() * 0));
126  channels.push_back(cv::Mat(s, CV_8UC1, getData().data() + s.area() * 1));
127  channels.push_back(cv::Mat(s, CV_8UC1, getData().data() + s.area() * 2));
128  cv::merge(channels, output);
129  } break;
130 
131  case Type::YUV420p:
132  cv::cvtColor(frame, output, cv::ColorConversionCodes::COLOR_YUV2BGR_IYUV);
133  break;
134 
135  case Type::NV12:
136  cv::cvtColor(frame, output, cv::ColorConversionCodes::COLOR_YUV2BGR_NV12);
137  break;
138 
139  case Type::NV21:
140  cv::cvtColor(frame, output, cv::ColorConversionCodes::COLOR_YUV2BGR_NV21);
141  break;
142 
143  case Type::RAW8:
144  case Type::RAW16:
145  case Type::RAW14:
146  case Type::RAW12:
147  case Type::RAW10:
148  case Type::GRAY8:
149  case Type::GRAYF16:
150  output = frame.clone();
151  break;
152 
153  default:
154  output = frame.clone();
155  break;
156  }
157 
158  return output;
159 }
160 
161 } // namespace dai
dai::RawImgFrame::Type::RAW8
@ RAW8
dai::RawImgFrame::Type::BITSTREAM
@ BITSTREAM
dai::ImgFrame::getFrame
void getFrame(T...)
Definition: ImgFrame.hpp:218
dai::RawImgFrame::Type::GRAYF16
@ GRAYF16
dai::RawImgFrame::Type::RAW12
@ RAW12
dai::RawImgFrame::Type::GRAY8
@ GRAY8
dai::RawImgFrame::Type::BGRF16F16F16p
@ BGRF16F16F16p
dai::RawImgFrame::Type::BGRF16F16F16i
@ BGRF16F16F16i
dai::RawImgFrame::Type::RGB888p
@ RGB888p
ImgFrame.hpp
dai::Buffer::getData
std::vector< std::uint8_t > & getData() const
Get non-owning reference to internal buffer.
Definition: Buffer.cpp:13
dai::RawImgFrame::Type::RGBF16F16F16p
@ RGBF16F16F16p
dai::RawImgFrame::Type::NV12
@ NV12
dai::ImgFrame::getType
Type getType() const
Definition: pipeline/datatype/ImgFrame.cpp:59
dai::RawImgFrame::Type::RGB888i
@ RGB888i
dai::RawImgFrame::Type::BGR888i
@ BGR888i
DAI_SPAN_NAMESPACE_NAME::detail::data
constexpr auto data(C &c) -> decltype(c.data())
Definition: span.hpp:177
dai::RawImgFrame::Type::BGR888p
@ BGR888p
dai::ImgFrame::getHeight
unsigned int getHeight() const
Definition: pipeline/datatype/ImgFrame.cpp:56
dai::RawImgFrame::Type::RAW14
@ RAW14
dai::RawImgFrame::Type::RAW16
@ RAW16
DAI_SPAN_NAMESPACE_NAME::detail::size
constexpr auto size(const C &c) -> decltype(c.size())
Definition: span.hpp:167
dai::ImgFrame::getCvFrame
void getCvFrame(T...)
Definition: ImgFrame.hpp:222
dai::RawImgFrame::Type::NV21
@ NV21
nanorpc::core::exception::to_string
std::string to_string(std::exception const &e)
Definition: exception.h:46
nanorpc::core::detail::pack::meta::type
type
Definition: pack_meta.h:26
dai::RawBuffer::data
std::vector< std::uint8_t > data
Definition: RawBuffer.hpp:14
dai::RawImgFrame::Type::RGBF16F16F16i
@ RGBF16F16F16i
dai::ImgFrame::setFrame
ImgFrame & setFrame(T...)
Definition: ImgFrame.hpp:213
dai::RawImgFrame::Type::RAW10
@ RAW10
dai::RawImgFrame::Type::YUV420p
@ YUV420p
dai::ImgFrame::img
RawImgFrame & img
Definition: ImgFrame.hpp:27
dai::DatatypeEnum::ImgFrame
@ ImgFrame
dai
Definition: CameraExposureOffset.hpp:6
dai::ImgFrame::getWidth
unsigned int getWidth() const
Definition: pipeline/datatype/ImgFrame.cpp:53


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