ctrl-utils
opencv.h
1 
10 #ifndef CTRL_UTILS_OPENCV_H_
11 #define CTRL_UTILS_OPENCV_H_
12 
13 #include <opencv2/opencv.hpp>
14 
15 #include "string.h"
16 
17 namespace ctrl_utils {
18 
25 template <>
26 inline void FromString(const std::string& str, cv::Mat& image) {
27  // Read image type.
28  std::stringstream ss(str);
29  int type;
30  ss >> type;
31 
32  switch (type) {
33  case CV_8UC1:
34  case CV_8UC2:
35  case CV_8UC3:
36  case CV_8UC4:
37  case CV_16UC1:
38  case CV_16UC2:
39  case CV_16UC3:
40  case CV_16UC4:
41  case CV_32FC1:
42  case CV_32FC2:
43  case CV_32FC3:
44  case CV_32FC4: {
45  // Read buffer.
46  int size;
47  ss >> size;
48  ss.get(); // Extract space.
49  std::vector<unsigned char> buffer(size);
50  ss.read(reinterpret_cast<char*>(buffer.data()), size);
51 
52  // Decode png.
53  cv::imdecode(buffer, cv::IMREAD_UNCHANGED, &image);
54  } break;
55  default: {
56  // Prepare image.
57  int rows, cols;
58  ss >> rows >> cols;
59  image.create(rows, cols, type);
60 
61  // Read raw bytes.
62  ss.read(reinterpret_cast<char*>(image.data),
63  image.total() * image.elemSize());
64  } break;
65  }
66 }
67 
74 inline std::string ToString(const cv::Mat& image) {
75  // Write image type.
76  std::stringstream ss;
77  ss << image.type() << " ";
78 
79  std::vector<unsigned char> buffer;
80  switch (image.type()) {
81  case CV_8UC1:
82  case CV_8UC2:
83  case CV_8UC3:
84  case CV_8UC4:
85  case CV_16UC1:
86  case CV_16UC2:
87  case CV_16UC3:
88  case CV_16UC4:
89  // Encode png.
90  cv::imencode(".png", image, buffer);
91 
92  // Write buffer.
93  ss << buffer.size() << " ";
94  ss.write(reinterpret_cast<char*>(buffer.data()), buffer.size());
95  break;
96  case CV_32FC1:
97  case CV_32FC2:
98  case CV_32FC3:
99  case CV_32FC4:
100  // Encode exr.
101  cv::imencode(".exr", image, buffer);
102 
103  // Write buffer.
104  ss << buffer.size() << " ";
105  ss.write(reinterpret_cast<char*>(buffer.data()), buffer.size());
106  break;
107  default:
108  // Write image dimensions.
109  ss << image.rows << " " << image.cols << " ";
110 
111  // Write raw bytes.
112  ss.write(reinterpret_cast<char*>(image.data),
113  image.total() * image.elemSize());
114  break;
115  }
116 
117  return ss.str();
118 }
119 
120 } // namespace ctrl_utils
121 
122 #endif // CTRL_UTILS_OPENCV_H_
Definition: ctrl_utils.cc:18
nlohmann::json FromString(const std::string &str)
Definition: json.h:27