c++ - 图像在 localhost 上显示已损坏
问题描述
我对 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;
}
现在发送消息工作得很好,但是当我尝试通过内容或 buff 发送图像时,它显示为乱码。我觉得这是因为在发送图片之前我没有发送任何有关图片的信息。但我不知道该怎么做。或者也许我完全错了。任何帮助/建议将不胜感激。干杯!
解决方案
我稍微简化了代码:
#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) 在我的图像查看器中看起来不错。
结论
我认为代码可能很好(但请检查上面的改进)并且您可能一直在错误地测试结果。
推荐阅读
- flutter - 在颤动中触发来自其他小部件的 SelectableLinkify 选择
- powershell - powershell 运行空间:访问全局变量 Yes 还是 no?
- java - 如何为java提取文件
- python-3.x - 如何使用 API 删除 WorkDocs 站点?
- typescript - 无法使打字稿识别打字
- pine-script - 我在输入大小时收到 Plotchar 错误
- javascript - Chart.js v3 使用缩放插件实例后保留在内存中
- c++ - C++ 处理不同大小的数值数据类型
- xcode - 为什么我不能访问扩展中的局部变量?(Xcode 11.4.1)
- javascript - Reacts js TypeError:无法读取未定义的属性“参数”