Потоковая передача данных матов OpenCV с помощью C ++ - PullRequest
1 голос
/ 05 августа 2020

В настоящее время я работаю с обнаружением объектов на машине Linux без дисплея (с OpenCV и C ++). Мне нужно передать выходные данные OpenCV (мат) на другой компьютер (Linux / Windows / Android) для отображения в режиме реального времени. Конечно, мне нужно сжатие (не сырые данные CV). Есть предложения по реализации?

Спасибо!

1 Ответ

0 голосов
/ 05 августа 2020

Возможно, вы могли бы попытаться передать данные через TCP.

Лучше использовать поток для отправки VIDEO_DATA, иначе это повлияет на процесс захвата OpenCV следующего кадра изображений. Вы можете добавить несколько алгоритмов сжатия изображения перед отправкой. Коды показаны ниже:

#include <atomic>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

std::string IP_ADDR {"123.45.67.89"};
int PORT = 6666;
std::atomic_flag flag = ATOMIC_FLAG_INIT;

void *tcp_thread_graph(void *arg) {
    struct sockaddr_in addr;
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if(sockfd == -1) { throw; }

    bzero(&addr, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = inet_addr(IP_ADDR.c_str());
    addr.sin_port = htons(PORT);

    int err = connect(sockfd, (struct sockaddr *)&addr, sizeof(addr));
    while(flag.test_and_set()) {
        //TODO: add compression algorithm before sending
        send(sockfd, (char*)VIDEO_DATA, sizeof(VIDEO_DATA), 0);
    }

    return nullptr;
}
...