当前位置: 首页 > news >正文

http发送和接收图片json文件

 一、http数据发送

1、先将图片转换为base64格式

std::string detectNet::Mat2Base64(const cv::Mat &image, std::string imgType){std::vector<uchar> buf;cv::imencode(imgType, image, buf);//uchar *enc_msg = reinterpret_cast<unsigned char*>(buf.data());std::string img_data = base64_encode(buf.data(), buf.size(), false);return img_data;
}

2、将数据以json格式进行发送

void detectNet::send_json_people(cv::Mat img, std::string label, std::string level, std::string rtsp){std::string out = Mat2Base64(img,".jpg");//std::cout << out << std::endl;ImgInfo imgInfo(out, label, level, rtsp);static auto client = httplib::Client("127.0.0.1", 18080);auto result = client.Post("/uploadAlgorithmResult", imgInfo.to_json_people(), "application/json");if (result != nullptr && result->status == 200) {std::cout << result->body << std::endl;}
}

其中 ImgInfo 类为:

#ifndef HTTP_DEMO_IMGINFO_H
#define HTTP_DEMO_IMGINFO_H#include <utility>#include "cJSON.h"
#include "base64.h"#define RTSP_URL "rtsp://admin:a123456789@192.168.8.31:554/h264/ch1/main/av_stream/1"
#define AlgorithmType "hook_detection"
#define AlgorithmType_people "danger_zone"
#define AlgorithmType_crooked "crooked"class ImgInfo {
private:std::string img;std::string label;std::string rtsp;std::string level;
public:ImgInfo(std::string img, std::string label, std::string level, std::string rtsp) : img(std::move(img)), label(std::move(label)),level(std::move(level)), rtsp(std::move(rtsp)) {}std::string to_json_people() {auto *root = cJSON_CreateObject();cJSON_AddStringToObject(root, "image", img.c_str());cJSON_AddStringToObject(root, "level", level.c_str());cJSON_AddStringToObject(root, "rtsp", rtsp.c_str());cJSON_AddStringToObject(root, "type", AlgorithmType_people);cJSON_AddStringToObject(root, "label", label.c_str());/*cJSON *label_array = cJSON_CreateArray();for (auto &i: label) {cJSON_AddItemToArray(label_array, cJSON_CreateString(i.c_str()));}cJSON_AddItemToObject(root, "label", label_array);*/char *out = cJSON_Print(root);std::string res = out;free(out);cJSON_Delete(root);return res;}
};#endif //HTTP_DEMO_IMGINFO_H

上述代码中json数据有五个部分:image为图片数据,level是告警等级,rtsp为数据流地址,type是算法类型,label是算法标签等,所以数据发送为这五个内容。

二、http数据接收

HttpServer.cpp如下: 

//#include <QFile>
//#include <FileUtils.hpp>
#include "HttpServer.h"
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
//#include "QString"
//#include "TimeUtils.hpp"
//#include "AlgorithmCommon.h"
//#include "QJsonObject"
//#include "QJsonDocument"
//#include "QJsonArray"
//#include "httplib.h"//#include "log.h"
//#include "cJSON.h"HttpServer::HttpServer(std::string ip, int port) : server_ip(ip), server_port(port) {//event_handler = new AlgorithmAlarmHandler();}HttpServer::~HttpServer() {stopListen();if (read_thd.joinable()) {read_thd.join();}
}void HttpServer::startListen() {read_thd = std::thread([=]() {serverListen();});//event_handler->startHandlerThread();
}void HttpServer::stopListen() {if (server.is_running()) {server.stop();}
}void HttpServer::serverListen() {if (!server.is_valid()) {std::cout << "http server invalid" << std::endl;return;}// 服务器状态server.Get("/server/status", [&](const Request &req, Response &res) {onServerStatus(req, res);});// 上传算法结果server.Post("/uploadAlgorithmResult", [&](const Request &req, Response &res) {onUploadAlgorithmResult(req, res);});// 错误处理server.set_error_handler([&](const Request &req, Response &res) {onErrorHandle(req, res);});//qDebug() << "server start listen";server.listen(server_ip.c_str(), server_port);
}void HttpServer::onServerStatus(const httplib::Request &req, httplib::Response &res) {res.body = R"({"code": 200,"msg": "Server is already Running"})";
}void HttpServer::onUploadAlgorithmResult(const httplib::Request &req, httplib::Response &res) {std::string content_type = httputillib::GetContentType(req.headers);//if (content_type != "application/json") {//     qDebug() << "contentType 异常, content_type:" << QString::fromStdString(content_type);//}bool parseRet = parseAlgorithmResult(req.body);//bool parseRet = true;std::string rspMsg;if (parseRet) {rspMsg = std::string(R"({"msg":"Recv Success, Parse Success."})");} else {rspMsg = std::string(R"({"msg":"Recv Success, Parse Failed."})");}res.body = std::move(rspMsg);
}// 错误请求处理
void HttpServer::onErrorHandle(const httplib::Request &req, httplib::Response &res) {const char *fmt = {"\"error\": \"服务器不支持该方法\""};char buf[BUFSIZ] = {0};snprintf(buf, sizeof(buf), fmt, res.status);res.set_content(buf, "application/json");
}bool HttpServer::parseAlgorithmResult(const std::string &body) {//std::cout << "body:" << body << std::endl;Json::Reader reader;Json::Value root;//std::ifstream in(body, std::ios::binary);//if (!in.is_open()) {//    std::cout << "open file failed" << std::endl;//    return false;//}if (!reader.parse(body, root)) {std::cout << "parse failed" << std::endl;return false;}std::string rtsp = root["rtsp"].asString();std::cout << "rtsp:" << rtsp << std::endl;std::string level = root["level"].asString();std::cout << "level:" << level << std::endl;std::string type = root["type"].asString();std::cout << "type:" << type << std::endl;std::string image = root["image"].asString();//std::cout << "image:" << image << std::endl;std::string out = base64_decode(image);std::string decoded_jpeg = std::move(out);//std::cout << "decoded_jpeg: " << decoded_jpeg << std::endl;cv::Mat mat2(1, decoded_jpeg.size(), CV_8U, (char*)decoded_jpeg.data());cv::Mat dst = cv::imdecode(mat2, CV_LOAD_IMAGE_COLOR);cv::imwrite(rtsp.substr(1) + ".jpg", dst);  return true;
}

 HttpServer.h如下:

//#ifndef CPPHTTPSERVER_HTTPSERVER_H
//#define CPPHTTPSERVER_HTTPSERVER_H#include "httputillib.h"
#include "httplib.h"
#include "base64.h"
//#include "thread"
#include <thread>
#include <time.h>#include <json.h>class HttpServer{
public:HttpServer(std::string ip, int port);~HttpServer();void startListen();void stopListen();private:void serverListen();// 回调函数: 错误请求处理void onErrorHandle(const httplib::Request &req, httplib::Response &res);// 回调函数: 获取服务器状态void onServerStatus(const httplib::Request &req, httplib::Response &res);// 回调函数: 上传算法结果void onUploadAlgorithmResult(const httplib::Request &req, httplib::Response &res);// 回调函数:处理算法数据bool parseAlgorithmResult(const std::string &body);std::string server_ip;int server_port;Server server;std::thread read_thd;};//#endif //CPPHTTPLIB_HTTPLIB_H

httputillib.h如下:

#include <httplib.h>using namespace httplib;namespace httputillib {
// 打印请求头
static std::string DumpHeaders(const Headers &headers) {std::string s;char buf[BUFSIZ] = {0};for (auto it = headers.begin(); it != headers.end(); ++it) {const auto &x = *it;snprintf(buf, sizeof(buf), "%s: %s\n", x.first.c_str(), x.second.c_str());s += buf;}return s;
}// 从请求同获取content type
static std::string GetContentType(const httplib::Headers &headers) {auto iter = headers.find("Content-Type");if (iter == headers.end()) {return std::string();}return iter->second;
}};

上述完整代码可详见github或者百度网盘

相关文章:

http发送和接收图片json文件

一、http数据发送 1、先将图片转换为base64格式 std::string detectNet::Mat2Base64(const cv::Mat &image, std::string imgType){std::vector<uchar> buf;cv::imencode(imgType, image, buf);//uchar *enc_msg reinterpret_cast<unsigned char*>(buf.data…...

MM-Camera架构-ProcessCaptureRequest 流程分析

文章目录 processCaptureRequest\_3\_41.1 mDevice1.2 mDevice->ops->process\_capture\_request1.3 hardware to vendor mct\_shimlayer\_process\_event2.1 mct\_shimlayer\_handle\_parm2.2 mct\_shimlayer\_reg\_buffer processCaptureRequest_3_4 sdm660的摄像头走…...

196、管理 RabbitMQ 的用户

开启Rabbitmq的一些命令&#xff1a; 小黑窗输入&#xff1a; rabbitmq-plugins enable rabbitmq_management 启动控制台插件&#xff0c; 就是启动登录rabbitmq控制台的页面&#xff0c;rabbitmq_management 代表了RabbitMQ的管理界面。 rabbitmq-server 启动rabbitMQ服务器…...

【已解决】Python读取sql数据,报错:Not an executable object,解决方案

【已解决】Python读取sql数据&#xff0c;报错&#xff1a;Not an executable object&#xff0c;解决方案 1.报错内容&#xff1a; 通过Python连接sql&#xff0c;读取sql中数据&#xff0c;报错&#xff1a;Not an executable object。具体代码及报错内容见下&#xff1a; …...

STM32 CubeMX ADC采集(HAL库)

STM32 CubeMX ADC采集&#xff08;HAL库&#xff09; STM32 CubeMX STM32 CubeMX ADC采集&#xff08;HAL库&#xff09;ADC介绍ADC主要特征最小识别电压值&#xff1a;2.4/4096≈0.6mv&#xff08;不考虑误差&#xff09;一、STM32 CubeMX设置二、代码部分三&#xff0c;单通道…...

[UUCTF 2022 新生赛]ezpop - 反序列化+字符串逃逸【***】

[UUCTF 2022 新生赛]ezpop 一、解题过程二、其他WP三、总结反思 一、解题过程 题目代码&#xff1a; <?php //flag in flag.php error_reporting(0); class UUCTF{public $name,$key,$basedata,$ob;function __construct($str){$this->name$str;}function __wakeup(){i…...

Selenium进行无界面爬虫开发

在网络爬虫开发中&#xff0c;利用Selenium进行无界面浏览器自动化是一种常见且强大的技术。无界面浏览器可以模拟真实用户的行为&#xff0c;解决动态加载页面和JavaScript渲染的问题&#xff0c;给爬虫带来了更大的便利。本文将为您介绍如何利用Selenium进行无界面浏览器自动…...

万宾荣获深圳应博会“全球应急产业先锋奖”创始人发表峰会演讲

今年5月&#xff0c;住房和城乡建设部表示将全面启动的城市基础设施生命线安全工程工作&#xff0c;通过各类智能感知设备等数字化手段&#xff0c;及早发现和管控城市燃气、桥梁、供水、排水防涝等领域的风险隐患&#xff0c;切实提高城市安全保障能力、维护人民生命财产安全&…...

某果的一个小参数分析

分析链接:aHR0cHM6Ly9hcHBsZWlkLmFwcGxlLmNvbS9hY2NvdW50 分析目标&#xff1a;X-Apple-I-Fd-Client-Info 1.在浏览器搜索关键词&#xff0c;打下断点 我们再里面进行搜索&#xff0c;定位到这个位置&#xff0c;可以看到X-Apple-I-FD-Client-Info这个参数等于e&#xff0c;…...

java学习--day22(进程线程)

文章目录 1.什么是进程2.什么是线程3.线程和进程的区别【面试题】4.并发和并行5.创建线程的两种方式【重点】1.继承Thread2.实现Runnable接口 6.线程下面的几个方法7.线程的同步和锁【重要】 1.什么是进程 是独立的运行程序 ​ 比如咱们电脑软件&#xff0c;你启动起来以后&…...

对音频切分成小音频(机器学习用)

我是把so-vits中小工具&#xff0c;分析源码然后提取出来了。以后可以写在自己的程序里。 -------流程&#xff08;这是我做的流程&#xff0c;你可以不用看&#xff09; 从开源代码中快速获取自己需要的东西 如果有界面f12看他里面的接口&#xff0c;然后在源码中全局搜索&…...

TensorFlow案例学习:对服装图像进行分类

前言 官方为我们提供了一个 对服装图像进行分类 的案例&#xff0c;方便我们快速学习 学习 预处理数据 案例中有下面这段代码 # 预处理数据&#xff0c;检查训练集中的第一个图像可以看到像素值处于0~255之间 plt.figure() # 创建图像窗口 plt.imshow(train_images[0]) # …...

单目3D目标检测——SMOKE 模型推理 | 可视化结果

本文分享SMOKE的模型推理&#xff0c;和可视化结果。以kitti数据集为例子&#xff0c;对训练完的模型进行推理&#xff0c;并可视化3D框的结果&#xff0c;画到图像中。 关于模型原理、搭建开发环境、模型训练&#xff0c;可以参考之前的博客&#xff1a; 【论文解读】SMOKE …...

C++智能指针shared_ptr使用详解

shared_ptr 是一个共享所有权的智能指针,允许多个指针指向同一个对象。 ​ shared_ptr使用引用计数,每一个shared_ptr的拷贝都指向相同的内存。每使用它一次,内部的引用计数加1,每析构一次,内部的引用计数减1,减为0时,释放所指向的堆内存。shared_ptr内部的引用计数是…...

基于Java的个性化旅游攻略系统设计与实现(源码+lw+ppt+部署文档+视频讲解等)

文章目录 前言具体实现截图论文参考详细视频演示代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技…...

中国替代方案探索:替代谷歌企业邮箱的选择

“谷歌企业邮箱在中国有哪些替代方案&#xff1f;在中国市场上表现出色的企业邮箱有腾讯企业邮箱、网易企业邮箱、阿里企业邮箱以及适合外贸的Zoho Mail企业邮箱。” 在中国由于各种原因&#xff0c;包括网络安全、数据隐私保护以及与GFW(防火长城)等&#xff0c;谷歌企业邮箱并…...

Holographic MIMO Surfaces (HMIMOS)以及Reconfigurable Holographic Surface(RHS)仿真

这里写目录标题 Simulation setupchatgpt帮我总结代码总结&#xff1a;chatgpt生成的代码还是不靠谱&#xff1a;考虑把之前看的RHS中对于多用户的改成单用户全系MIMO与普通MIMO或者说RIS的区别到底是啥&#xff1f; Holographic MIMO Surfaces &#xff08;HMIMOS&#xff09;…...

RK3568笔记一:RKNN开发环境搭建

若该文为原创文章&#xff0c;转载请注明原文出处。 由于对AI的好奇&#xff0c;想要学习如何部署AI&#xff0c;所以从RV1126到RK3568中过渡。 一、介绍 RK3568开发板使用的是正点原子新出的ATK-DLRK3568 开发板&#xff0c;主要是学习从训练到部署的全过程&#xff0c;并记…...

设计模式 - 行为型模式:策略模式(概述 | 案例实现 | 优缺点 | 使用场景)

目录 一、行为型模式 1.1、策略模式 1.1.1、概论 1.1.2、案例实现 1.1.3、优缺点 1.1.4、使用场景 一、行为型模式 1.1、策略模式 1.1.1、概论 策略模式设计的每一个算法都封装了起来&#xff0c;使他们可以相互替换&#xff0c;通过一个对象委派不同的算法给相应的客户…...

rancher部署pv、pvc、离线部署nfs

&#xff08;1&#xff09;NFS离线安装 使用nfs配置两台机器共享目录 假设两台机器188.188.30.32&#xff08;服务端&#xff09;、188.188.30.31&#xff08;客户端&#xff09;配置nfs 1.在可以联网的机器上下载rpm安装包 yum -y install nfs-utils --downloadonly --dow…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...