
本文介绍通过轻量级 flask web api 实现 kotlin android 应用调用 python ocr 服务的完整方案,涵盖服务端搭建、http 图像上传、错误处理及客户端集成要点。
本文介绍通过轻量级 flask web api 实现 kotlin android 应用调用 python ocr 服务的完整方案,涵盖服务端搭建、http 图像上传、错误处理及客户端集成要点。
在移动应用开发中,常需将计算密集型任务(如 OCR、图像处理)下沉至 Python 后端执行,而前端 Kotlin(如 Android App)负责采集图像并发起请求。最实用、低门槛的跨语言集成方式是构建一个 RESTful HTTP 接口——Flask 因其简洁性、零配置启动和良好移动端兼容性,成为首选方案。
✅ Flask 服务端:接收图像并返回结构化结果
以下是一个生产就绪的简化版 Flask OCR 服务示例(支持 multipart/form-data 图像上传):
from flask import Flask, request, jsonify
import cv2
import numpy as np
import base64
from io import BytesIO
from PIL import Image
app = Flask(__name__)
@app.route('/process_image', methods=['POST'])
def process_image():
try:
# 1. 验证文件字段
if 'input_image' not in request.files:
return jsonify({'error': 'Missing file field: input_image'}), 400
file = request.files['input_image']
if file.filename == '':
return jsonify({'error': 'No selected file'}), 400
# 2. 读取并解码图像
img_bytes = file.read()
nparr = np.frombuffer(img_bytes, np.uint8)
img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
if img is None:
return jsonify({'error': 'Invalid image format'}), 400
# 3. 执行 OCR 或图像处理逻辑(此处以 Tesseract 示例)
# import pytesseract
# text = pytesseract.image_to_string(img, lang='eng')
# 4. 可选:返回处理后图像(Base64 编码)
_, buffer = cv2.imencode('.png', img) # 或返回识别文本
encoded_img = base64.b64encode(buffer).decode('utf-8')
return jsonify({
'status': 'success',
'recognized_text': 'SAMPLE OCR OUTPUT', # 替换为真实 OCR 结果
'processed_image_base64': encoded_img
})
except Exception as e:
return jsonify({'error': f'Server error: {str(e)}'}), 500
if __name__ == '__main__':
# 开发时可启用 debug;生产环境务必关闭,并使用 Gunicorn/uWSGI
app.run(host='0.0.0.0', port=5000, debug=False)
⚠️ 注意事项:
- 确保 Python 环境已安装 flask, opencv-python, numpy, Pillow(图像处理)及 pytesseract(OCR);
- 若部署到公网/局域网,需修改 host='0.0.0.0' 并确保防火墙开放端口(如 5000);
- 移动端访问本地 Flask 服务时,Android 模拟器需用 10.0.2.2(而非 localhost)指向宿主机;真机则需确保与 Python 服务处于同一局域网。
✅ Kotlin 客户端:上传图像并解析响应
在 Android 项目中(使用 OkHttp + Gson),发送图像并处理 JSON 响应:
// 添加依赖(build.gradle)
// implementation "com.squareup.okhttp3:okhttp:4.12.0"
// implementation "com.google.code.gson:gson:2.10.1"
fun uploadImageAndOcr(imageUri: Uri, context: Context) {
val file = File(uriToFile(context, imageUri))
val request = MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("input_image", file.name, RequestBody.create(
MediaType.parse("image/png"),
file
))
.build()
val client = OkHttpClient()
val url = "http://YOUR_SERVER_IP:5000/process_image" // 注意替换为实际 IP
val httpRequest = Request.Builder().url(url).post(request).build()
client.newCall(httpRequest).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
Log.e("OCR", "Network error", e)
}
override fun onResponse(call: Call, response: Response) {
if (response.isSuccessful) {
val result = Gson().fromJson(response.body?.string(), OcrResponse::class.java)
Log.d("OCR", "Result: ${result.recognized_text}")
} else {
Log.e("OCR", "HTTP error: ${response.code}")
}
}
})
}
data class OcrResponse(
val status: String,
val recognized_text: String,
val processed_image_base64: String? = null
)
✅ 替代方案对比(简要)
| 方案 | 适用场景 | 上手难度 | 维护成本 | 备注 |
|---|---|---|---|---|
| Flask API | 快速原型、局域网调试、中小规模 | ⭐⭐ | ⭐⭐ | 推荐入门首选 |
| Django REST | 需用户管理、权限、数据库集成 | ⭐⭐⭐⭐ | ⭐⭐⭐ | 过重,OCR 场景不必要 |
| Cloud (e.g., FastAPI on AWS Lambda) | 高并发、弹性伸缩需求 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | 涉及部署、计费、冷启动延迟 |
| 直接进程通信(JNI/Shell) | 极致性能、离线场景 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | 兼容性差、平台绑定强,不推荐 |
总结:对于 Kotlin(Android)与 Python(OCR)项目的集成,Flask 提供了最小可行、高可控、易调试的 HTTP 管道。只需确保网络可达、接口契约清晰(如统一字段名、错误码)、图像编码一致,即可稳定支撑 OCR 流程。后续可平滑升级为 Docker 容器化部署或接入 Nginx 反向代理提升健壮性。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











