该图显示本地主机上已损坏

时间:2019-10-11 08:49:39

标签: c++ networking webserver boost-asio

我对C ++和程序设计感到陌生。我只是想尝试使用opencv读取图片,并使用boost asio将其显示在Web服务器上。对于视频中的所有帧,这是第一步。以下是我的代码-

#include <iostream>
#include <string>
#include <boost/asio.hpp>
#include <thread>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>

using boost::asio::ip::tcp;
using namespace std;
using namespace cv;

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);
            boost::system::error_code ignored_error;

            cv::Mat frame = cv::imread("x.jpg");
            vector<uchar> buff;
            vector<int> param = vector<int>(2);
            param[0]=cv::IMWRITE_JPEG_QUALITY;
            param[1]=95;
            imencode(".jpg",frame,buff,param);

            const char mess[] = "axaxaxaxasaaaaaaaaaaxax";

            std::string content(buff.begin(), buff.end());

            boost::asio::write(socket, boost::asio::buffer(content), boost::asio::transfer_all(), ignored_error);
            // boost::asio::write(socket, boost::asio::buffer(mess), boost::asio::transfer_all(), ignored_error);
        }
    }
    catch(std::exception& e)
    {
        std::cerr << e.what() << std::endl;
    }
    return 0;
}

现在发送消息的效果很好,但是当我尝试通过内容或浅黄色发送图像时,它显示为乱码。我感觉是因为在发送图片之前我没有发送任何有关图片的信息。但是我不知道该怎么做。 也许我完全错了。任何帮助/建议,将不胜感激。干杯!

1 个答案:

答案 0 :(得分:1)

我对代码进行了一些简化:

#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

将样本jpeg复制为x.jpg,并在终端中运行它:

./test.exe

然后使用netcat读取结果:

netcat localhost 1112 > verify.jpg

服务器进程每次都会打印相同的消息:

Written: 6130 (Success)

(6130字节恰好是我选择的测试图像的95%重新编码的大小)。生成的图像(verify.jpg)在我的图像查看器中看起来不错。

结论

我认为代码可能不错(但是请检查上面的改进),并且您可能已经错误地测试了结果。