Перенос изображений в веб-сокет с помощью библиотеки Boost

Я хочу передать данные изображения в websocket с помощью библиотеки boost.

Как мне разрешить ошибку ниже?

Сначала я подтвердил, что могу передавать и получать текстовые данные, перейдя по следующему URL-адресу. https://www.boost.org/doc/libs/1_68_0/libs/beast/doc/html/beast/quick_start.html

И затем, хотя я пытался передать изображение, я получил следующее сообщение об ошибке.

 websocket_client.cpp:563:38: error: no matching function for call to 'buffer(cv::Mat&)'

 ws.write(boost::asio::buffer(img));

То, что я сделал, ниже.

  1. прочитать файл изображения как img с помощью opencv.

  2. Измените код для передачи данных

    // Send the message
    
    // ws.write(boost::asio::buffer(std::string(text)));
    
    ws.write(boost::asio::buffer(img));
    

person haru    schedule 28.01.2021    source источник
comment
boost.org/doc/libs/1_66_0/ doc / html / boost_asio / reference / Вам необходимо преобразовать его в соответствующий формат, который поддерживается буфером ускорения. Нет соответствующей перегрузки, которая принимает 'Mat &'   -  person Build Succeeded    schedule 28.01.2021


Ответы (1)


cv :: Mat не является типом буфера и не адаптируется как таковой. Если у вас есть данные POD, вы можете использовать их, как говорит комментатор:

 // don't do this:
 buffer(&img, sizeof(img));

Однако это небезопасно:

static_assert(std::is_standard_layout_v<cv::Mat>);
static_assert(std::is_trivial_v<cv::Mat>);

Тип фактически не может быть побитовым копированием. Но поскольку существует матрица, вероятно, существует непрерывная область данных, которая равна:

ws.write(net::buffer(img.data, img.total() * img.elemSize()));

Здесь используются total() и _ 5_, ссылки на документацию.

Теперь этого будет достаточно, если принимающая сторона уже знает размеры. Если нет, сначала отправьте их, например:

uint32_t dimensions[] { htonl(image_witdh), htonl(image_height) };

std::vector<net::const_buffer> buffers {
    net::buffer(dimensions),
    net::buffer(img.data, img.total() * img.elemSize())
};
ws.write(buffers);
person sehe    schedule 29.01.2021
comment
Мне удалось передать изображение на сервер как двоичное. Но я не могу показать изображение. Как я мог это сделать? Сообщение об ошибке img = np.frombuffer (message, dtype = np.uint8) #NG TypeError: требуется объект, подобный байтам, а не str - person haru; 29.01.2021
comment
Боюсь, вы в Проблема X / Y. Если бы вы спросили, как мне отобразить изображение, полученное через веб-сокеты, вы получите совершенно другие ответы. stackoverflow.com/questions/9292133/ - person sehe; 29.01.2021