|
| 1 | +from winrt.windows.media.ocr import OcrEngine |
| 2 | +from winrt.windows.globalization import Language |
| 3 | +from winrt.windows.storage.streams import DataWriter |
| 4 | +from winrt.windows.graphics.imaging import SoftwareBitmap, BitmapPixelFormat |
| 5 | + |
| 6 | +def recognize_bytes(bytes, width, height, lang='en'): |
| 7 | + cmd = 'Add-WindowsCapability -Online -Name "Language.OCR~~~en-US~0.0.1.0"' |
| 8 | + assert OcrEngine.is_language_supported(Language(lang)), cmd |
| 9 | + writer = DataWriter() |
| 10 | + writer.write_bytes(list(bytes)) |
| 11 | + sb = SoftwareBitmap.create_copy_from_buffer(writer.detach_buffer(), BitmapPixelFormat.RGBA8, width, height) |
| 12 | + return OcrEngine.try_create_from_language(Language(lang)).recognize_async(sb) |
| 13 | + |
| 14 | +def recognize_pil(img, lang='en'): |
| 15 | + if img.mode != 'RGBA': |
| 16 | + img = img.convert('RGBA') |
| 17 | + return recognize_bytes(img.tobytes(), img.width, img.height, lang) |
| 18 | + |
| 19 | +def recognize_cv2(img, lang='en'): |
| 20 | + import cv2 |
| 21 | + img = cv2.cvtColor(img, cv2.COLOR_BGR2RGBA) |
| 22 | + return recognize_bytes(img.tobytes(), img.shape[1], img.shape[0], lang) |
| 23 | + |
| 24 | +def _serializer(o): |
| 25 | + from winrt.windows.foundation.collections import IVectorView |
| 26 | + return list(o) if isinstance(o, IVectorView) else dict([(n, getattr(o, n)) for n in dir(o) if not n.startswith('_')]) |
| 27 | + |
| 28 | +def serve(): |
| 29 | + import json |
| 30 | + import uvicorn |
| 31 | + from PIL import Image |
| 32 | + from io import BytesIO |
| 33 | + from fastapi import FastAPI, Request, Response |
| 34 | + from fastapi.middleware.cors import CORSMiddleware |
| 35 | + |
| 36 | + app = FastAPI() |
| 37 | + app.add_middleware(CORSMiddleware, allow_origins=['*'], allow_credentials=True, allow_methods=['*'], allow_headers=['*']) |
| 38 | + @app.post('/') |
| 39 | + async def recognize(request: Request, lang: str = 'en'): |
| 40 | + result = await recognize_pil(Image.open(BytesIO(await request.body())), lang) |
| 41 | + return Response(json.dumps(result, default=_serializer, indent=2, ensure_ascii=False), media_type='application/json') |
| 42 | + uvicorn.run(app, host='0.0.0.0') |
| 43 | + |
| 44 | +if __name__ == '__main__': |
| 45 | + serve() |
0 commit comments