From 69eba455f9f5f6a4a947d97561aa421d1c9fea70 Mon Sep 17 00:00:00 2001 From: Sam Hos Date: Wed, 22 Jan 2025 13:32:43 +0100 Subject: [PATCH] added image compression to thread --- src/C++/Driver/src/main.cpp | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/C++/Driver/src/main.cpp b/src/C++/Driver/src/main.cpp index b9c336b..87dc3de 100644 --- a/src/C++/Driver/src/main.cpp +++ b/src/C++/Driver/src/main.cpp @@ -48,7 +48,7 @@ void setup() int main() { setup(); - // std::thread image(CapnSend); + std::thread image(CapnSend); std::thread safety([&](){ robot.robotSafety(&message); }); std::thread sendMqtt([&](){ sendKobukiData(robot.parser.data); }); std::thread connectionChecker(checkKobukiConnection); @@ -66,7 +66,7 @@ int main() sendMqtt.join(); safety.join(); - // image.join(); + image.join(); } std::mutex connectionMutex; @@ -407,6 +407,7 @@ std::string serializeKobukiData(const TKobukiData &data) json += "]}"; return json; } + // create extra function to send the message every 100ms // needed it so it can be threaded void sendKobukiData(TKobukiData &data) @@ -420,7 +421,8 @@ void sendKobukiData(TKobukiData &data) } void CapnSend() { - VideoCapture cap(0); + int COMPRESSION_LEVEL = 80; + VideoCapture cap(0); // Open the camera if (!cap.isOpened()) { cerr << "Error: Could not open camera" << endl; return; @@ -444,14 +446,21 @@ void CapnSend() { } } - // Convert the image to a byte array + // Compress the image (JPEG compression with adjustable quality) vector buf; - imencode(".jpg", frame, buf); - auto *enc_msg = reinterpret_cast(buf.data()); + vector compression_params; + compression_params.push_back(IMWRITE_JPEG_QUALITY); // Set JPEG quality + compression_params.push_back(COMPRESSION_LEVEL); // Adjust the quality level (0-100, lower = more compression) - // Publish the image data - client.publishMessage("kobuki/cam", string(enc_msg, enc_msg + buf.size())); - cout << "Sent image" << endl; + // Encode the image into the byte buffer with the specified compression parameters + imencode(".jpg", frame, buf, compression_params); + + // Convert the vector buffer to a string (no casting) + string enc_msg(buf.begin(), buf.end()); + + // Publish the compressed image data (MQTT, in this case) + client.publishMessage("kobuki/cam", enc_msg); + cout << "Sent compressed image" << endl; std::this_thread::sleep_for(std::chrono::milliseconds(200)); // Send image every 200ms }