Grpc高速传输图片C++/python To Python

目录

 

序言:

前期准备:

代码实现:

 现在来看服务端:

下面是客户端: 


序言:

之前因业务需要,玩了一下GRPC,但是最终没有上马项目。时间一刹那间,又到了现在,因有需求,需要用到远程通讯(局域网),即一个程序调用另外一个程序的函数。为什么要这样呢?因为我们用到了开源的东西,开源的东西对Python天然的友好支持,这还不是重点,重点是C++的API有坑,会崩,这让我们一直用C++的猿类很郁闷。没办法,等不了新版本的。于是上用python做服务端,C++当客户端。通过C++来调用Python的服务端的函数。就像本地调用一样。捣鼓了几天,因为不懂Python,走了不少坑,还好,Python是个比较简单的language。通宵熬夜看了一晚,大概懂个所以然。就开干了。码字不容易,对你有帮助就mark啊,点赞啊,转发啊。打赏也行啊,哈哈哈哈哈哈。

前期准备:

Python的Grpc库很简单,直接就pip install grpcio 和 pip install grpcio_tools,好像就这个吧。然后C++的就比较复杂了,要编译一大堆。这里可以参考我以前的文章:

windows平台下编译gRPC的坎坷之路和解决方法附上编译好的lib和头文件下载

下载好之后,该配置的头文件和库给它配上,C++这个语言就是一把屠龙刀,什么都得自己造,但是牛逼。 

然后就开始编写proto文件了,这玩意其实就是个协议,里面定义了要实现的类和方法以及数据类型。如下:保存为了data.proto

//协议的版本
syntax = 'proto3';
// 服务定义,这个就是我们在程序中要定义的类了,类名就是data
service data{
    // 函数定义 data_request参数 data_reply返回数据,这个就是在服务器要实现的方法了,是个函数
    rpc serving(data_request) returns (data_reply) {}
}
//数据类型,其实我只要一个就可以了
message data_request{
    string cmd= 1;
}
//数据类型
message data_reply{
    string values = 1;
}

然后生成.py文件和.cc文件(不同的平台要编译成不同的)

这是参考来自:https://www.jianshu.com/p/43fdfeb105ff?from=timeline&isappinstalled=0

# 编译 proto 文件
python -m grpc_tools.protoc --python_out=. --grpc_python_out=. -I. data.proto

python -m grpc_tools.protoc: python 下的 protoc 编译器通过 python 模块(module) 实现, 所以说这一步非常省心
--python_out=. : 编译生成处理 protobuf 相关的代码的路径, 这里生成到当前目录
--grpc_python_out=. : 编译生成处理 grpc 相关的代码的路径, 这里生成到当前目录
-I. data.proto : proto 文件的路径, 这里的 proto 文件在当前目录

会生成:
data_pb2.py
data_pb2_grpc.py
这个就可以在python里面调用了


//编译.cc文件
protoc --grpc_out=. --plugin=protoc-gen-grpc=grpc_cpp_plugin.exe data.proto
protoc --cpp_out=. data.proto

会生成四个文件:
data.grpc.pb.h
data.grpc.pb.cc
data.pb.h
data.pb.cc

 

代码实现:

 现在来看服务端:

#server.py文件,记得把那两个生成的.py文件放到同一个目录下哦

import grpc
import time
from concurrent import futures
from probuf import data_pb2
from probuf import data_pb2_grpc
import cv2
import base64
import numpy as np
import sys
import threading

_ONE_DAY_IN_SECONDS = 60 * 60 * 24


class ServerGreeter(data_pb2_grpc.dataServicer):
    ocr_class = 0
    def __init__(self):
        '初始化OCR识别类'
        self.ocr_class = ocr_sys.ocr_ser()
    def serving(self, request, context):
        '服务类,用来监视及响应客户端'
        print('serving:')
        #=====================接收图片=====================
        #先解码
        decode_img = base64.b64decode(request.cmd)
        #变成一个矩阵
        img = np.fromstring(decode_img, dtype=np.int8)
        #再解码成图片
        img_decode = cv2.imdecode(img, cv2.IMREAD_COLOR)

        #dong something 该处理什么 就处理什么
        #res_img,rec_text = self.ocr_class.run_ocr(rec_img=img_decode)
        #rgb = bgr[..., ::-1] #bgr与rgb互转,Paddleocr在可视化的时候,新建的图是RGB的,但是opencv是BGR的
        bgr_IMG = res_img[..., ::-1]
        cv2.imwrite('./ph.jpg',bgr_IMG
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值