Я немного упростил код:
#include <iostream>
#include <string>
#include <boost/asio.hpp>
#include <opencv2/opencv.hpp>
using boost::asio::ip::tcp;
int main(){
try{
boost::asio::io_service io_service;
tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 1112));
for (;;){
tcp::socket socket(io_service);
acceptor.accept(socket);
cv::Mat frame = cv::imread("x.jpg");
std::vector<uchar> buff;
imencode(".jpg", frame, buff, std::vector<int> { cv::IMWRITE_JPEG_QUALITY, 95 });
boost::system::error_code err;
auto bytes_transferred = boost::asio::write(socket, boost::asio::buffer(buff), boost::asio::transfer_all(), err);
std::cout << "Written: " << bytes_transferred << " (" << err.message() << ")\n";
}
}
catch(std::exception& e)
{
std::cerr << e.what() << std::endl;
}
}
(в частности, не используйте using namespace
без необходимости, не копируя в std :: string без необходимости, ибез необходимости игнорировать код ошибки)
Скомпилировал его с помощью
g++ test.cpp -L/usr/local/lib -pedantic -Wall -Wextra -pthread -lope^Cv_{core,imgproc,imgcodecs} -lboost_{system,thread} -o test.exe
Скопировал spepe jpeg как x.jpg, запустив его в терминале:
./test.exe
Затем с помощью netcat
для чтения результата:
netcat localhost 1112 > verify.jpg
Процесс сервера будет печатать одно и то же сообщение каждый раз:
Written: 6130 (Success)
(6130 байт получается95% перекодированного размера тестового изображения, которое я выбрал). Полученное изображение (verify.jpg) выглядит хорошо в моей программе просмотра изображений.
Заключение
Я думаю, что код, вероятно, в порядке (но проверьте с улучшениями выше), и вы, возможно, тестировалирезультат неправильный.