IRSOL
C++ code implementing socket server for interacting with Baumer camera.
main-opencv.cpp
Go to the documentation of this file.
1
15
16#include "irsol/irsol.hpp"
17
18#include <chrono>
19#include <opencv2/opencv.hpp>
20#include <unordered_map>
21
24const std::string
26{
27#ifndef PROGRAM_NAME
28#define PROGRAM_NAME "loading-images-opencv-demo"
29#endif
30 return PROGRAM_NAME;
31}
32
34struct Params
35{
37 spdlog::level::level_enum logLevel{spdlog::level::info};
38
40 uint64_t numFrames{10};
41
43 double fps = -1;
44};
45
57getParams(int argc, char** argv)
58{
59 args::ArgumentParser parser(getProgramName());
60 args::HelpFlag help(parser, "help", "Display this help menu", {'h', "help"});
61
62 args::MapFlag<std::string, spdlog::level::level_enum> logLevelArg(
63 parser, "level", "Log level", {'l', "log-level"}, irsol::levelNameToLevelMap);
64
65 args::ValueFlag<uint64_t> numFramesArg(
66 parser, "#frames", "Number of frames to iterate over", {'n', "frames-count"});
67
68 args::ValueFlag<double> fpsArg(parser, "fps", "Desired FPS for capturing image", {'f', "fps"});
69
70 try {
71 parser.ParseCLI(argc, argv);
72 } catch(args::Help) {
73 std::cerr << parser.Help() << std::endl;
74 std::exit(0);
75 } catch(args::ParseError e) {
76 std::cerr << "Error parsing command-line arguments:\n" << e.what() << "\n\n" << parser.Help();
77 std::exit(1);
78 }
79
80 Params params{};
81 if(logLevelArg) {
82 params.logLevel = args::get(logLevelArg);
83 }
84 if(numFramesArg) {
85 params.numFrames = args::get(numFramesArg);
86 }
87 if(fpsArg) {
88 params.fps = args::get(fpsArg);
89 }
90 return params;
91}
92
97void
99{
100 auto image = cam.captureImage();
101
102 if(image.IsEmpty()) {
103 IRSOL_LOG_WARN("Image is empty.");
104 }
105
106 auto cvMat = irsol::opencv::convertNeoImageToCvMat(image);
107
108 IRSOL_LOG_INFO("{}x{}, {} bytes", image.GetHeight(), image.GetWidth(), image.GetSize());
109 cv::imshow(getProgramName(), cvMat);
110 cv::waitKey(1);
111}
112
119int
120main(int argc, char** argv)
121{
122 // Parse command-line parameters
123 auto params = getParams(argc, argv);
124
125 // Construct log file path based on program name
126 std::string logPath = "logs/" + getProgramName() + ".log";
127 irsol::initLogging(logPath.c_str(), params.logLevel);
128
129 // Enable custom assertion handler
131
132 // Choose camera resolution based on build type
133#ifdef DEBUG
134 auto cameraInterface = irsol::camera::Interface::FullResolution();
135#else
136 auto cameraInterface = irsol::camera::Interface::HalfResolution();
137#endif
138
139 // Ensure the camera is connected before continuing
140 IRSOL_ASSERT_FATAL(cameraInterface.isConnected(), "Camera is not connected");
141
142 // Log camera metadata for debugging purposes
143 IRSOL_LOG_INFO("\n{}", cameraInterface.cameraInfoAsString());
144 IRSOL_LOG_INFO("\n{}", cameraInterface.cameraStatusAsString());
145
146 // Start a monitoring thread to log camera status
147 irsol::camera::StatusMonitor monitor(cameraInterface, std::chrono::milliseconds(500));
148 monitor.start();
149
150 // Capture and log a sequence of frames
151 auto lastTick = irsol::types::clock_t::now();
152 const auto desiredDt =
153 params.fps > 0.0 ? std::chrono::microseconds(static_cast<uint64_t>(1000000.0 / params.fps))
154 : std::chrono::microseconds(0);
155 for(size_t i = 0; i < params.numFrames; ++i) {
156 const auto t0 = irsol::types::clock_t::now();
157 runCapture(cameraInterface);
158 const auto nextTick = lastTick + desiredDt;
159 lastTick = nextTick;
160 std::this_thread::sleep_until(nextTick);
161 const auto loopDuration = irsol::types::clock_t::now() - t0;
162 const auto measuredFps =
163 1000000.0 / std::chrono::duration_cast<std::chrono::microseconds>(loopDuration).count();
164 IRSOL_LOG_INFO("Desired FPS: {:.4f}, measured FPS: {:.4f}", params.fps, measuredFps);
165 }
166
167 return 0;
168}
High-level wrapper around the NeoAPI camera for synchronized access.
Definition interface.hpp:61
image_t captureImage(std::optional< irsol::types::duration_t > timeout=std::nullopt)
Capture a single image from the camera.
static Interface HalfResolution()
Factory method to create a camera interface using half sensor resolution.
Definition interface.cpp:63
static Interface FullResolution()
Factory method to create a camera interface using full sensor resolution.
Definition interface.cpp:49
Class that offers an easy way to run a background monitorin thread that periodically inspects and rep...
Definition monitor.hpp:44
void start()
Starts the monitoring thread. If the monitor is already running, this call has no effect.
Definition monitor.cpp:42
int main()
Definition main.cpp:90
void initAssertHandler()
Initializes the assertion handler system.
Definition assert.cpp:14
#define IRSOL_ASSERT_FATAL
Fatal-level assertion macro.
Definition assert.hpp:135
#define IRSOL_LOG_INFO(...)
Logs an info-level message using the default logger.
Definition logging.hpp:92
#define IRSOL_LOG_WARN(...)
Logs a warning-level message using the default logger.
Definition logging.hpp:93
void initLogging(const char *fileSinkFilename="logs/irsol.log", std::optional< spdlog::level::level_enum > minLogLevel=std::nullopt)
Initializes the irsol logging system.
Definition logging.cpp:108
const std::unordered_map< std::string, spdlog::level::level_enum > levelNameToLevelMap
Runtime map from string names to spdlog log levels.
Definition logging.hpp:254
cv::Mat convertNeoImageToCvMat(const NeoAPI::Image &image)
Converts a NeoAPI::Image (Mono12, non-packed) into an OpenCV cv::Mat.
Definition opencv.cpp:12
const std::string getProgramName()
Returns the program name, typically used for logging. If PROGRAM_NAME is not defined at compile time,...
#define PROGRAM_NAME
Params getParams(int argc, char **argv)
Parses command-line arguments using args library.
void runCapture(irsol::camera::Interface &cam)
Captures a single image using the provided camera interface, logs metadata and performance stats.
Command-line parameters for the program.
double fps
FPS at which to capture frames from the camera (negative means as fast as you can)
uint64_t numFrames
Number of frames to capture from the camera (default: 10)
spdlog::level::level_enum logLevel
Logging verbosity level (default: info)