$ cat browser-document-scanner-opencv.jsonاسکنر اسناد: بینایی ماشین داخل مرورگر
عکس گوشی رو به یه اسکن تمیز و صاف تبدیل میکنه، با پایتون و OpenCV که کاملاً داخل مرورگر اجرا میشن؛ عکس هیچوقت آپلود نمیشه. کد متنباز و دموی زنده.

معرفی پروژه
هدف یه اسکنر شبیه CamScanner بود، ولی فقط با بینایی ماشین کلاسیک و بدون اینکه کسی مجبور باشه سندش رو روی سرور کسی آپلود کنه. نسخهی کتابی الگوریتم (Canny، پیدا کردن کانتور، تبدیل پرسپکتیو، آستانهگذاری) روی دادهی مصنوعی بینقص کار میکرد؛ روی عکس واقعی نه.
بخش اصلی کار پر کردن همین فاصله بود: پسزمینهای که به لبهی برگه چسبیده بود و کانتور رو خراب میکرد، هالهی دور حروف بعد از حذف سایه، بافت JPEG و کاغذ، و دفتر سیمی که اصلاً لبهی بستهای نداشت. برای هر کدوم علت از روی تصویرهای میانی پیدا شد و براش یه تست اضافه شد که با کد قدیمی رد میشه و با کد جدید قبول.
آخر کار، همون کد پایتون با Pyodide به مرورگر منتقل شد: سرور فقط فایل استاتیک میده، هزینهی پردازش صفره، و عکسها هیچوقت از دستگاه کاربر بیرون نمیرن.
نکات کلیدی
- پایتون و OpenCV کاملاً داخل مرورگر، بدون سرور پردازش
- عکس هیچوقت از دستگاه کاربر خارج نمیشه
- دو آشکارساز برگه، با بررسی صحت برای جواب اشتباه
- هر باگ واقعی با یه تست رگرسیون پوشش داده شده
- خروجی رنگی، خاکستری، سیاهوسفید و PDF
- متنباز، با case study کامل روی گیتهاب
پیادهسازی فنی
حدود ۳۵۰ خط پایتون با OpenCV و NumPy. دو آشکارساز برگه: یکی بر اساس لبه (با RETR_LIST تا کانتور داخلی تمیز بمونه) و یکی بر اساس رنگ کاغذ (روشن و کماشباع در HSV) برای وقتی لبهی بستهای نیست، با یه بررسی صحت که جواب اشتباه خودش رو رد میکنه. حذف سایه با morphological closing روی نسخهی کوچکشده، و levels بهجای کشش درصدی.
اجرا با Pyodide (CPython کامپایلشده به WebAssembly) و یه bridge کوچیک بین canvas و NumPy؛ رابط HTML/JS با گوشههای قابلکشیدن روی موبایل. CSP سختگیرانهی سایت فقط برای مسیر ابزار شل شده، و فایلهای پایتون با revalidate بارگذاری میشن تا مرورگر نسخهی قدیمی رو اجرا نکنه.


