
本文介绍通过轻量级 http 接口(flask)将 kotlin 移动端图像上传至 python 后端执行 ocr 与图像处理,并返回结构化结果的完整集成方案,兼顾开发效率与生产可行性。
本文介绍通过轻量级 http 接口(flask)将 kotlin 移动端图像上传至 python 后端执行 ocr 与图像处理,并返回结构化结果的完整集成方案,兼顾开发效率与生产可行性。
在跨语言项目协作中,Kotlin(常用于 Android 应用)与 Python(擅长计算机视觉与 OCR)的组合非常典型:前者负责前端交互与图像采集,后者承担 OpenCV、Tesseract 等专业图像处理任务。直接嵌入 Python 运行时(如 Chaquopy)虽可行,但存在包兼容性、APK 体积膨胀和调试复杂等问题;而基于 HTTP 的进程间通信则更解耦、易维护、可独立部署。
✅ 推荐方案:Flask 构建轻量 REST API
Flask 是最简实践路径——无需 Django 的重型框架开销,也无需云服务(如 AWS Lambda)的运维成本,本地快速验证 + 后续平滑迁移至服务器或容器环境(Docker + Nginx)。
▶ Python 后端(Flask 示例)
以下是一个健壮、可扩展的 Flask 服务端示例,支持接收图像文件、解码为 OpenCV 格式、执行 OCR(以 pytesseract 为例),并返回 JSON 结果:
# app.py
from flask import Flask, request, jsonify
import cv2
import numpy as np
import pytesseract
app = Flask(__name__)
@app.route('/ocr', methods=['POST'])
def ocr_endpoint():
try:
# 1. 验证文件上传
if 'image' not in request.files:
return jsonify({'error': 'Missing image file'}), 400
file = request.files['image']
if file.filename == '':
return jsonify({'error': 'Empty filename'}), 400
# 2. 读取并解码图像(支持 JPG/PNG)
img_bytes = np.frombuffer(file.read(), np.uint8)
img = cv2.imdecode(img_bytes, cv2.IMREAD_COLOR)
if img is None:
return jsonify({'error': 'Invalid image format'}), 400
# 3. 执行 OCR(示例:提取文本)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
text = pytesseract.image_to_string(gray, lang='eng')
# 4. 可选:返回处理后图像 Base64(如需预览)
_, buffer = cv2.imencode('.png', gray)
processed_img_b64 = base64.b64encode(buffer).decode('utf-8')
return jsonify({
'success': True,
'text': text.strip(),
'processed_image_base64': processed_img_b64 # 按需返回
})
except Exception as e:
return jsonify({'error': f'Processing failed: {str(e)}'}), 500
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=False) # 生产环境务必关闭 debug
⚠️ 注意事项:
- 安装依赖:pip install flask opencv-python pytesseract
- 确保系统已安装 Tesseract CLI(如 brew install tesseract 或 apt-get install tesseract-ocr)
- 开发时可设 host='0.0.0.0' 允许局域网访问;Android 设备需与 PC 在同一 Wi-Fi 下,URL 使用 PC 局域网 IP(如 http://192.168.1.100:5000/ocr)
- 生产部署建议添加 CORS 支持(flask-cors)、请求大小限制(app.config['MAX_CONTENT_LENGTH'] = 4 * 1024 * 1024)及 HTTPS
▶ Kotlin 客户端(Android 示例)
使用 OkHttp 发送 multipart 表单请求(推荐,兼容性好):
// 假设 bitmap 来自 CameraX 或 ImageView
fun uploadImageForOCR(bitmap: Bitmap, callback: (Result<string>) -> Unit) {
val url = "http://192.168.1.100:5000/ocr" // 替换为实际 Flask 地址
val client = OkHttpClient()
// 转 Bitmap → JPEG byte array
val stream = ByteArrayOutputStream()
bitmap.compress(Bitmap.CompressFormat.JPEG, 85, stream)
val imageBytes = stream.toByteArray()
val requestBody = MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("image", "photo.jpg", RequestBody.create(
MediaType.parse("image/jpeg"), imageBytes
))
.build()
val request = Request.Builder()
.url(url)
.post(requestBody)
.build()
client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
callback(Result.failure(e))
}
override fun onResponse(call: Call, response: Response) {
if (response.isSuccessful && response.body != null) {
val result = response.body!!.string()
callback(Result.success(result))
} else {
callback(Result.failure(Exception("HTTP ${response.code()}")))
}
}
})
}</string>
✅ 权限声明(AndroidManifest.xml):
<uses-permission android:name="android.permission.INTERNET"></uses-permission><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
? 总结与演进建议
- 入门首选 Flask:零配置启动、代码直观、调试友好,适合 MVP 验证;
-
进阶优化方向:
- 使用 FastAPI 替代 Flask(自动 OpenAPI 文档、异步支持更好);
- 将 Python 服务容器化(Docker),通过 Kubernetes 编排多实例;
- 对接云 OCR(如 Google Vision API)替代本地 Tesseract,提升准确率与多语言支持;
- Kotlin 端引入协程封装网络调用,配合 ViewModel 实现生命周期感知。
这种“Kotlin 前端采集 → HTTP 上传 → Python 后端处理 → JSON 返回”的分层架构,既发挥各自语言生态优势,又保障系统可测试性与可伸缩性。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











