60 lines
1.7 KiB
C++
60 lines
1.7 KiB
C++
#include <opencv2/videoio.hpp>
|
|
#include <cstring>
|
|
#include <iostream>
|
|
#include <netinet/in.h>
|
|
#include <sys/socket.h>
|
|
#include <unistd.h>
|
|
#include "transfer.h"
|
|
#include "logging.h"
|
|
#include <chrono>
|
|
#include <boost/asio.hpp>
|
|
|
|
using namespace std;
|
|
using boost::asio::ip::tcp;
|
|
|
|
int main() {
|
|
const int FRAME_DELAY_MS = 1000 / 30;
|
|
|
|
// create video capture
|
|
cv::VideoCapture cap = cv::VideoCapture(0);
|
|
try {
|
|
boost::asio::io_context io_context;
|
|
tcp::resolver resolver(io_context);
|
|
|
|
tcp::resolver::results_type endpoints =
|
|
resolver.resolve("127.0.0.1", "8080");
|
|
|
|
cv::Mat image = cv::Mat::zeros(cv::Size(640, 480), CV_8UC3);
|
|
|
|
info("Ready to connect.");
|
|
// sending connection request
|
|
tcp::socket socket(io_context);
|
|
boost::asio::connect(socket, endpoints);
|
|
|
|
info("Connected.");
|
|
// create buffer for serialization
|
|
vector<uchar> imgbuf;
|
|
|
|
while (true) {
|
|
auto start_time = std::chrono::high_resolution_clock::now();
|
|
cap.read(image);
|
|
trace("Sending image");
|
|
sendImage(socket, image, imgbuf);
|
|
|
|
auto end_time = std::chrono::high_resolution_clock::now();
|
|
auto elapsed_time = std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time);
|
|
|
|
// Calculate the remaining time to sleep
|
|
auto sleep_duration = std::chrono::milliseconds(FRAME_DELAY_MS) - elapsed_time;
|
|
|
|
// Sleep for the remaining duration if positive
|
|
if (sleep_duration.count() > 0) {
|
|
std::this_thread::sleep_for(sleep_duration);
|
|
}
|
|
}
|
|
}
|
|
catch (std::exception& e) {
|
|
error(e.what());
|
|
}
|
|
return 0;
|
|
} |