关于GRPC的相关知识。
文件路径:D:\vcpkg\packages\protobuf_x64-windows\tools\protobuf
PS D:\vcpkg\packages\protobuf_x64-windows\tools\protobuf> .\protoc --grpc_out=. --plugin=protoc-gen-grpc=.\grpc_cpp_plugin.exe .\Interface.proto
PS D:\vcpkg\packages\protobuf_x64-windows\tools\protobuf> .\protoc --cpp_out=. .\Interface.proto
PS D:\vcpkg\packages\protobuf_x64-windows\tools\protobuf>
syntax = "proto3";
package DataTransmission;
service ImgTransmission {rpc Upload(stream ChunkOneLine) returns (Reply) {}
}
message Chunk
{int32 imgData0 = 1;int32 imgData1 = 2;int32 imgData2 = 3;int32 imgData3 = 4;bytes buff = 5;
}
message imgparm
{int32 type = 1;int32 rows = 2;int32 cols = 3;int32 channel = 4;
}
message ChunkOneLine
{repeated Chunk oneLineData = 1;imgparm imgParmData = 2;Chunk dataBuf = 3;
}
message Rectangle {int32 x = 1; // 矩形框的x坐标int32 y = 2; // 矩形框的y坐标int32 width = 3; // 矩形框的宽度int32 height = 4; // 矩形框的高度
}
message Reply {int32 defectType = 1; // 缺陷信息repeated Rectangle rectangles = 2; // 一个矩形框列表
}
class SAFServer final :public DataTransmission::ImgTransmission::Service
{
public:Status Upload(ServerContext* context, ServerReader<ChunkOneLine>* reader, Reply* reply);
};
Status SAFServer::Upload(ServerContext* context, ServerReader<ChunkOneLine>* reader, Reply* reply)
{std::chrono::system_clock::time_point start_time = std::chrono::system_clock::now();ChunkOneLine oneLie;imgparm imgp;reader->Read(&oneLie);imgp = oneLie.imgparmdata();int Type = imgp.type();imgType = Type;cv::Mat mat;std::string str_decon;str_decon = oneLie.databuf().buff();std::vector<uchar>data(str_decon.begin(), str_decon.end());mat = cv::imdecode(data, 1);img = mat;iouThr = 0.25;Params ID;DetectResult DR;ID.inputImg.push_back(img);ID.imgType.push_back(imgType);Process(ID, DR, iouThr, OD, OS, SAA);std::chrono::system_clock::time_point end_time = std::chrono::system_clock::now();auto sec = std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time);std::cout << "Time cost :" << sec.count() << std::endl;std::cout << "resultNum:" << DR.defectType.size() << std::endl;if (SDR.defectType.size() > 0){reply->set_defecttype(DR.defectType[0]);for (int i = 0; i < DR.OCRect.size(); i++){DataTransmission::Rectangle rectangle;rectangle.set_x(DR.OCRect[i].x);rectangle.set_y(DR.OCRect[i].y);rectangle.set_width(DR.OCRect[i].width);rectangle.set_height(DR.OCRect[i].height);reply->add_rectangles()->CopyFrom(rectangle);}}{reply->set_defecttype(0);DataTransmission::Rectangle rectangle;rectangle.set_x(0);rectangle.set_y(0);rectangle.set_width(0);rectangle.set_height(0);reply->add_rectangles()->CopyFrom(rectangle);}//cv::resize(mat, mat, cv::Size(mat.cols / 4, mat.rows / 4));//cv::imshow("bb", mat);//cv::waitKey(100);delete oneLie.release_databuf(); // 释放 chunkreturn grpc::Status::OK;
}