97 lines
2.6 KiB
C++
97 lines
2.6 KiB
C++
|
|
#include <opencv2/opencv.hpp>
|
|||
|
|
#include <zmq.hpp>
|
|||
|
|
#include <unistd.h>
|
|||
|
|
#include <stdlib.h>
|
|||
|
|
#include <cstring>
|
|||
|
|
#include <iostream>
|
|||
|
|
#include "logc/log.h"
|
|||
|
|
#include "tomlc99/toml.h"
|
|||
|
|
#include "capture.h"
|
|||
|
|
|
|||
|
|
#define config_file_path "../config.toml"
|
|||
|
|
|
|||
|
|
int main(int argc, char **argv)
|
|||
|
|
{
|
|||
|
|
FILE *fp;
|
|||
|
|
char errbuf[200];
|
|||
|
|
|
|||
|
|
fp = fopen(config_file_path, "r");
|
|||
|
|
if (!fp)
|
|||
|
|
{
|
|||
|
|
log_error("can not open conifg file");
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
toml_table_t *conf = toml_parse_file(fp, errbuf, sizeof(errbuf));
|
|||
|
|
fclose(fp);
|
|||
|
|
|
|||
|
|
if (!conf)
|
|||
|
|
{
|
|||
|
|
log_error("cannot parse - %s", errbuf);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
toml_table_t *server = toml_table_in(conf, "server");
|
|||
|
|
if (!server)
|
|||
|
|
{
|
|||
|
|
log_error("missing [server]");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
toml_datum_t server_0_index = toml_int_in(server, "server_0_index");
|
|||
|
|
toml_datum_t server_1_index = toml_int_in(server, "server_1_index");
|
|||
|
|
toml_datum_t server_2_index = toml_int_in(server, "server_2_index");
|
|||
|
|
toml_datum_t server_0_port = toml_int_in(server, "server_0_port");
|
|||
|
|
toml_datum_t server_1_port = toml_int_in(server, "server_1_port");
|
|||
|
|
toml_datum_t server_2_port = toml_int_in(server, "server_2_port");
|
|||
|
|
|
|||
|
|
capture cap0(server_0_index.u.i, server_0_port.u.i);
|
|||
|
|
capture cap1(server_1_index.u.i, server_1_port.u.i, 320, 240, 25);
|
|||
|
|
capture cap2(server_2_index.u.i, server_2_port.u.i);
|
|||
|
|
|
|||
|
|
cap0.start();
|
|||
|
|
// cap1.start();
|
|||
|
|
cap2.start();
|
|||
|
|
|
|||
|
|
while (1)
|
|||
|
|
{
|
|||
|
|
usleep(1);
|
|||
|
|
}
|
|||
|
|
// while (true)
|
|||
|
|
// {
|
|||
|
|
// cap >> frame;
|
|||
|
|
// if (frame.empty())
|
|||
|
|
// {
|
|||
|
|
// std::cerr << "Empty frame" << std::endl;
|
|||
|
|
// break;
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// // 确保图像是连续的
|
|||
|
|
// if (!frame.isContinuous())
|
|||
|
|
// {
|
|||
|
|
// frame = frame.clone().reshape(1, frame.total());
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// // std::cout << frame.cols << ":" << frame.rows << std::endl;
|
|||
|
|
|
|||
|
|
// // cv::imshow("realtime", frame);
|
|||
|
|
|
|||
|
|
// // 发送帧的元数据(宽度、高度、类型等)
|
|||
|
|
// // 这里简单起见,只发送宽度和高度(假设类型为 CV_8UC3)
|
|||
|
|
// zmq::message_t header_msg(sizeof(int) * 2);
|
|||
|
|
// int *header_data = static_cast<int *>(header_msg.data());
|
|||
|
|
// header_data[0] = frame.cols;
|
|||
|
|
// header_data[1] = frame.rows;
|
|||
|
|
// // socket.send(header_msg, zmq::send_flags::sndmore);
|
|||
|
|
|
|||
|
|
// // 发送帧数据
|
|||
|
|
// zmq::message_t frame_msg((size_t)frame.total() * frame.elemSize());
|
|||
|
|
// memcpy(frame_msg.data(), frame.data, frame.total() * frame.elemSize());
|
|||
|
|
// socket.send(frame_msg, zmq::send_flags::none);
|
|||
|
|
// // 在这里添加一些延迟,以控制帧率
|
|||
|
|
// cv::waitKey(1);
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// // 关闭视频捕获和 ZMQ 套接字
|
|||
|
|
// cap.release();
|
|||
|
|
// socket.close();
|
|||
|
|
return 0;
|
|||
|
|
}
|