目录
序言:
之前因业务需要,玩了一下GRPC,但是最终没有上马项目。时间一刹那间,又到了现在,因有需求,需要用到远程通讯(局域网),即一个程序调用另外一个程序的函数。为什么要这样呢?因为我们用到了开源的东西,开源的东西对Python天然的友好支持,这还不是重点,重点是C++的API有坑,会崩,这让我们一直用C++的猿类很郁闷。没办法,等不了新版本的。于是上用python做服务端,C++当客户端。通过C++来调用Python的服务端的函数。就像本地调用一样。捣鼓了几天,因为不懂Python,走了不少坑,还好,Python是个比较简单的language。通宵熬夜看了一晚,大概懂个所以然。就开干了。码字不容易,对你有帮助就mark啊,点赞啊,转发啊。打赏也行啊,哈哈哈哈哈哈。
前期准备:
Python的Grpc库很简单,直接就pip install grpcio 和 pip install grpcio_tools,好像就这个吧。然后C++的就比较复杂了,要编译一大堆。这里可以参考我以前的文章:
下载好之后,该配置的头文件和库给它配上,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