1
+ #pragma once
2
+
3
+ #include < rerun.hpp>
4
+
5
+ #include < eigen3/Eigen/Core>
6
+ #include < opencv2/core.hpp>
7
+
8
+ // Adapters so we can log eigen vectors as rerun positions:
9
+ template <>
10
+ struct rerun ::CollectionAdapter<rerun::Position3D, std::vector<Eigen::Vector3f>> {
11
+ Collection<rerun::Position3D> operator ()(const std::vector<Eigen::Vector3f>& container) {
12
+ return Collection<rerun::Position3D>::borrow (container.data (), container.size ());
13
+ }
14
+
15
+ Collection<rerun::Position3D> operator ()(std::vector<Eigen::Vector3f>&& container) {
16
+ std::vector<rerun::Position3D> positions (container.size ());
17
+ memcpy (positions.data (), container.data (), container.size () * sizeof (Eigen::Vector3f));
18
+ return Collection<rerun::Position3D>::take_ownership (std::move (positions));
19
+ }
20
+ };
21
+
22
+ // Adapters so we can log an eigen matrix as rerun positions:
23
+ template <>
24
+ struct rerun ::CollectionAdapter<rerun::Position3D, Eigen::Matrix3Xf> {
25
+ Collection<rerun::Position3D> operator ()(const Eigen::Matrix3Xf& matrix) {
26
+ // Sanity check that this is binary compatible.
27
+ static_assert (
28
+ sizeof (rerun::Position3D) ==
29
+ sizeof (Eigen::Matrix3Xf::Scalar) * Eigen::Matrix3Xf::RowsAtCompileTime
30
+ );
31
+ static_assert (alignof (rerun::Position3D) <= alignof (Eigen::Matrix3Xf::Scalar));
32
+ return Collection<rerun::Position3D>::borrow (
33
+ // Cast to void because otherwise Rerun will try to do above sanity checks with the wrong type (scalar).
34
+ reinterpret_cast <const void *>(matrix.data ()),
35
+ matrix.cols ()
36
+ );
37
+ }
38
+
39
+ Collection<rerun::Position3D> operator ()(Eigen::Matrix3Xf&& matrix) {
40
+ std::vector<rerun::Position3D> positions (matrix.cols ());
41
+ memcpy (positions.data (), matrix.data (), matrix.size () * sizeof (rerun::Position3D));
42
+ return Collection<rerun::Position3D>::take_ownership (std::move (positions));
43
+ }
44
+ };
45
+
46
+ // Adapters so we can borrow an OpenCV image easily into Rerun images without copying:
47
+ template <>
48
+ struct rerun ::CollectionAdapter<uint8_t , cv::Mat> {
49
+ Collection<uint8_t > operator ()(const cv::Mat& img) {
50
+ return Collection<uint8_t >::borrow (img.data , img.total () * img.channels ());
51
+ }
52
+
53
+ Collection<uint8_t > operator ()(cv::Mat&& img) {
54
+ std::vector<uint8_t > img_vec (img.total () * img.channels ());
55
+ img_vec.assign (img.data , img.data + img.total () * img.channels ());
56
+ return Collection<uint8_t >::take_ownership (std::move (img_vec));
57
+ }
58
+ };
59
+
60
+ // Adapter for extracting tensor dimensions from an OpenCV matrix.
61
+ template <>
62
+ struct rerun ::CollectionAdapter<rerun::datatypes::TensorDimension, cv::Mat> {
63
+ Collection<rerun::datatypes::TensorDimension> operator ()(const cv::Mat& img) {
64
+ // Only specify the const& operator since there is no way of borrowing the dimensions anyways.
65
+ return {
66
+ static_cast <size_t >(img.rows ),
67
+ static_cast <size_t >(img.cols ),
68
+ static_cast <size_t >(img.channels ()),
69
+ };
70
+ }
71
+ };
0 commit comments