关于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.protoPS 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;bytesbuff = 5;}message imgparm{int32 type = 1;int32 rows = 2;int32 cols = 3;int32 channel = 4;}message ChunkOneLine{repeated Chunk oneLineData = 1;imgparm imgParmData = 2;ChunkdataBuf = 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(); // 释放 chunk return grpc::Status::OK;}