ColorImage.cc
Go to the documentation of this file.
1 
37 #ifdef WIN32
38 #ifndef WIN32_LEAN_AND_MEAN
39 #define WIN32_LEAN_AND_MEAN 1
40 #endif
41 
42 #include <windows.h>
43 #include <winsock2.h>
44 #else
45 #include <unistd.h>
46 #include <arpa/inet.h> // htons
47 #endif
48 
49 #include <fstream>
50 #include <iomanip>
51 #include <iostream>
52 #include <memory>
53 #include <signal.h>
54 #include <stdio.h>
55 #include <stdlib.h>
56 #include <string.h>
57 #include <string>
58 #include <cstdint>
59 #include <array>
60 
61 #include <getopt/getopt.h>
62 #include <ChannelUtilities.hh>
63 #include <Io.hh>
64 
66 #include <MultiSense/MultiSenseChannel.hh>
67 
68 using namespace crl::multisense;
69 
70 namespace { // anonymous
71 
72 volatile bool doneG = false;
73 
74 void usage(const char* programNameP)
75 {
76  std::cerr << "USAGE: " << programNameP << " [<options>]" << std::endl;
77  std::cerr << "Where <options> are:" << std::endl;
78  std::cerr << "\t-a <current_address> : CURRENT IPV4 address (default=10.66.171.21)" << std::endl;
79  std::cerr << "\t-m <mtu> : CURRENT MTU (default=1500)" << std::endl;
80  std::cerr << "\t-s <color_source> : LEFT,RIGHT,AUX (default=aux)" << std::endl;
81 
82  exit(1);
83 }
84 
85 #ifdef WIN32
86 BOOL WINAPI signalHandler(DWORD dwCtrlType)
87 {
88  CRL_UNUSED(dwCtrlType);
89  doneG = true;
90  return TRUE;
91 }
92 #else
93 void signalHandler(int sig)
94 {
95  (void)sig;
96  doneG = true;
97 }
98 #endif
99 
100 struct UserData
101 {
102  Channel* driver = nullptr;
103  std::shared_ptr<const ImageBufferWrapper> chroma = nullptr;
104  std::shared_ptr<const ImageBufferWrapper> luma = nullptr;
107  std::pair<DataSource, DataSource> colorSource;
108 };
109 
110 bool saveColor(const std::string& fileName,
111  std::shared_ptr<const ImageBufferWrapper> leftRect,
112  std::shared_ptr<const ImageBufferWrapper> leftChromaRect)
113 {
114  std::vector<uint8_t> output(leftRect->data().width * leftRect->data().height * 3);
115  ycbcrToBgr(leftRect->data(), leftChromaRect->data(), output.data());
116 
117  io::savePpm(fileName, leftRect->data().width, leftRect->data().height, output.data());
118  return true;
119 }
120 
121 void imageCallback(const image::Header& header,
122  void* userDataP)
123 {
124  UserData* userData = reinterpret_cast<UserData*>(userDataP);
125 
126 
127  if (!userData->driver) {
128  std::cerr << "Invalid MultiSense channel" << std::endl;
129  return;
130  }
131 
132  if (header.source == userData->colorSource.first)
133  {
134  userData->chroma = std::make_shared<ImageBufferWrapper>(userData->driver, header);
135  if (userData->luma && userData->luma->data().frameId == header.frameId)
136  {
137  // matching frameID's, pass through to create image
138  }
139  else
140  {
141  return;
142  }
143  }
144  if (header.source == userData->colorSource.second)
145  {
146  userData->luma = std::make_shared<ImageBufferWrapper>(userData->driver, header);
147  if (userData->chroma && userData->chroma->data().frameId == header.frameId)
148  {
149  // matching frameID's, pass through to create image
150  }
151  else
152  {
153  return;
154  }
155  }
156 
157  if (userData->luma != nullptr && userData->chroma != nullptr)
158  {
159  saveColor(std::to_string(header.frameId) + ".ppm", userData->luma,
160  userData->chroma);
161  }
162 }
163 
164 std::pair<DataSource, DataSource> colorSourceFromArg(const std::string &srcStr)
165 {
166  if (srcStr == "aux")
167  {
169  }
170  else if (srcStr == "left")
171  {
173  }
174  else if (srcStr == "right")
175  {
177  }
178  else
179  {
180  throw std::runtime_error("Invalid color source given");
181  }
182 }
183 
184 } // anonymous
185 
186 int main(int argc,
187  char** argvPP)
188 {
189  std::string currentAddress = "10.66.171.21";
190  int32_t mtu = 0;
191  std::pair<DataSource, DataSource> userSource{ Source_Chroma_Rectified_Aux, Source_Luma_Rectified_Aux };
192 
193 #if WIN32
194  SetConsoleCtrlHandler(signalHandler, TRUE);
195 #else
196  signal(SIGINT, signalHandler);
197 #endif
198 
199  //
200  // Parse args
201 
202  int c;
203 
204  while (-1 != (c = getopt(argc, argvPP, "a:m:s:")))
205  switch (c) {
206  case 'a': currentAddress = std::string(optarg); break;
207  case 'm': mtu = atoi(optarg); break;
208  case 's': userSource = colorSourceFromArg(optarg); break;
209  default: usage(*argvPP); break;
210  }
211 
212  Status status;
213 
214  //
215  // Initialize communications.
216 
217  auto channelP = std::make_unique<ChannelWrapper>(currentAddress);
218  if (nullptr == channelP || nullptr == channelP->ptr()) {
219  std::cerr << "Failed to establish communications with \"" << currentAddress << "\"" << std::endl;
220  return EXIT_FAILURE;
221  }
222 
223  //
224  // Change MTU
225  if (mtu >= 1500)
226  status = channelP->ptr()->setMtu(mtu);
227  else
228  status = channelP->ptr()->setBestMtu();
229  if (Status_Ok != status) {
230  std::cerr << "Failed to set MTU: " << Channel::statusString(status) << std::endl;
231  return EXIT_FAILURE;
232  }
233 
234  //
235  // Query calibration
236 
237  image::Calibration calibration;
238  status = channelP->ptr()->getImageCalibration(calibration);
239  if (Status_Ok != status) {
240  std::cerr << "Failed to query calibration: " << Channel::statusString(status) << std::endl;
241  return EXIT_FAILURE;
242  }
243 
244  //
245  // Query device info
246 
248  status = channelP->ptr()->getDeviceInfo(deviceInfo);
249  if (Status_Ok != status) {
250  std::cerr << "Failed to query device info: " << Channel::statusString(status) << std::endl;
251  return EXIT_FAILURE;
252  }
253 
254  //
255  // Change framerate and resolution to 1/4 resolution
256 
257  image::Config cfg;
258 
259  status = channelP->ptr()->getImageConfig(cfg);
260  if (Status_Ok != status) {
261  std::cerr << "Failed to get image config: " << Channel::statusString(status) << std::endl;
262  return EXIT_FAILURE;
263  }
264  else {
265  cfg.setFps(10.0);
266  cfg.setAutoWhiteBalance(true);
267  cfg.setAutoExposure(true);
268  cfg.setResolution(deviceInfo.imagerWidth / 2, deviceInfo.imagerHeight / 2);
269 
270  status = channelP->ptr()->setImageConfig(cfg);
271  if (Status_Ok != status) {
272  std::cerr << "Failed to configure sensor: " << Channel::statusString(status) << std::endl;
273  return EXIT_FAILURE;
274  }
275  }
276 
277  //
278  // Setup user data to store camera state for pointcloud reprojection
279 
280  UserData userData{ channelP->ptr(), nullptr, nullptr, calibration, deviceInfo, userSource };
281 
282  //
283  // Add callbacks
284 
285  channelP->ptr()->addIsolatedCallback(imageCallback, userSource.first | userSource.second, &userData);
286 
287  //
288  // Start streaming
289 
290  status = channelP->ptr()->startStreams(userSource.first | userSource.second);
291  if (Status_Ok != status) {
292  std::cerr << "Failed to start streams: " << Channel::statusString(status) << std::endl;
293  return EXIT_FAILURE;
294  }
295 
296  while (!doneG) {
297  usleep(1000000);
298  }
299 
300  status = channelP->ptr()->stopStreams(Source_All);
301  if (Status_Ok != status) {
302  std::cerr << "Failed to stop streams: " << Channel::statusString(status) << std::endl;
303  return EXIT_FAILURE;
304  }
305 
306  return EXIT_SUCCESS;
307 }
usage
static void usage()
Definition: FirmwareUpdateUtility.cc:51
crl::multisense::Status_Ok
static CRL_CONSTEXPR Status Status_Ok
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:99
crl::multisense::image::Config::setAutoExposure
void setAutoExposure(bool e)
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:877
getopt.h
getopt
int getopt(int argc, char **argv, char *opts)
Definition: getopt.c:31
ChannelUtilities.hh
CRL_UNUSED
#define CRL_UNUSED(var)
Definition: Legacy/include/MultiSense/details/utility/Portability.hh:44
crl::multisense::Source_Luma_Left
static CRL_CONSTEXPR DataSource Source_Luma_Left
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:121
Portability.hh
crl::multisense::Source_Chroma_Left
static CRL_CONSTEXPR DataSource Source_Chroma_Left
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:125
crl::multisense::system::DeviceInfo::imagerWidth
uint32_t imagerWidth
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:3307
crl::multisense::image::Config
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:797
io::savePpm
bool savePpm(const std::string &fileName, uint32_t width, uint32_t height, const void *dataP)
Definition: Io.hh:43
crl::multisense::Channel::statusString
static const char * statusString(Status status)
Definition: Legacy/details/channel.cc:876
crl::multisense::system::DeviceInfo
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:3245
crl::multisense::Source_All
static CRL_CONSTEXPR DataSource Source_All
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:118
crl::multisense::image::Calibration
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:1910
crl::multisense::Source_Luma_Right
static CRL_CONSTEXPR DataSource Source_Luma_Right
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:122
ycbcrToBgr
constexpr std::array< uint8_t, 3 > ycbcrToBgr(const crl::multisense::image::Header &luma, const crl::multisense::image::Header &chroma, const size_t u, const size_t v)
Definition: ChannelUtilities.hh:115
crl::multisense::Status
int32_t Status
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:94
header
std_msgs::Header const * header(const M &m)
crl::multisense::Channel
Definition: Legacy/include/MultiSense/MultiSenseChannel.hh:69
crl::multisense::image::Config::setAutoWhiteBalance
void setAutoWhiteBalance(bool e)
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:930
crl::multisense::Source_Chroma_Right
static CRL_CONSTEXPR DataSource Source_Chroma_Right
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:126
crl::multisense
Definition: Legacy/details/channel.cc:62
main
int main(int argc, char **argvPP)
Definition: ColorImage.cc:186
optarg
char * optarg
Definition: getopt.c:29
crl::multisense::Source_Chroma_Rectified_Aux
static CRL_CONSTEXPR DataSource Source_Chroma_Rectified_Aux
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:127
Io.hh
crl::multisense::image::Config::setResolution
void setResolution(uint32_t w, uint32_t h)
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:811
crl::multisense::image::Config::setFps
void setFps(float f)
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:852
crl::multisense::system::DeviceInfo::imagerHeight
uint32_t imagerHeight
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:3309
multisense::to_string
std::string to_string(const Status &status)
Convert a status object to a user readable string.
Definition: utilities.cc:137
crl::multisense::image::Header
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:460
crl::multisense::Source_Luma_Rectified_Aux
static CRL_CONSTEXPR DataSource Source_Luma_Rectified_Aux
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:142


multisense_lib
Author(s):
autogenerated on Thu Apr 17 2025 02:49:08