יישום סריקת מסמכים באמצעות מצלמת מובייל
אנחנו צוות של מהנדסי מובייל עם ניסיון של 7+ שנים בראייה ממוחשבת ב-iOS ואנדרואיד. במהלך תקופה זו, יישמנו סריקה של דרכונים, חוזים, קבלות וספרים פתוחים. המשתמש מחזיק את הטלפון מעל המסמך, האפליקציה מוצאת אוטומטית את קצוות הדף, מתקנת פרספקטיבה ומוציאה PDF נקי. זה לא "צילום תמונה וחתוך" — בפנים יש גלאי קווי מתאר (Canny, Hough), טרנספורמציה הומוגרפית ועיבוד לאחר לקריאות. כל שלב יכול להיהרס אם לא מתחשבים בתנאי תאורה ובסוגי מסמכים. צרו קשר כדי להעריך את הפרויקט שלכם — נעזור לכם לבחור את הפתרון האופטימלי.
למה זיהוי קצוות נכשל על בוהק וצללים
ב-iOS, VNDetectRectanglesRequest (Vision) מחזיר VNRectangleObservation עם ארבע נקודות פינה בקואורדינטות מנורמלות. הבעיה היא שעל נייר מבריק תחת אור ישיר, האלגוריתם מבלבל בין בוהק לקצה הדף. פתרון: לפני הזיהוי, יש להחיל CIFilter עם CIColorControls (הפחתת inputSaturation) ו-CIHighlightShadowAdjust. זה מסיר בוהק כפגמי צבע. בנוסף, אפשר להגדיל ניגודיות (רמה 1.2–1.5) כדי להפריד טוב יותר בין קצוות.
באנדרואיד, ML Kit Document Scanner (com.google.android.gms:play-services-mlkit-document-scanner) מתמודד טוב יותר עם צללים אך דורש Google Play Services. חלופה ללא תלות ב-GMS היא OpenCV findContours + approxPolyDP עם סינון לפי שטח ויחס גובה-רוחב. סף של minArea = 30% משטח המסגרת מסנן אובייקטי רקע. עוד על האלגוריתם ב-תיעוד OpenCV. עבור Flutter, אנו משתמשים בערוץ מקורי דרך cunning_document_scanner, שמעביר את הזיהוי לפלטפורמה.
איך לבחור בין SDK מקורי ל-OpenCV?
הבחירה תלויה במערכת האקולוגית. אם האפליקציה משתמשת ב-Google Play Services, ML Kit מספק ממשק משתמש מוכן ודיוק טוב. למכשירים ללא GMS (למשל, Huawei) — OpenCV. ב-iOS, Vision הוא הבחירה האופטימלית מאז 2017, תומך ב-Live Photos ובהאצת Metal. עם זאת, OpenCV דורש שיקולי רישוי (BSD) ויותר קוד. ביצועים: ב-iPhone 13, זיהוי Vision לוקח ~80 אלפיות השנייה, OpenCV (~120 אלפיות השנייה עם אופטימיזציית NEON).
איך לבצע נכון תיקון פרספקטיבה
לאחר קבלת ארבע נקודות, יש להחיל טרנספורמציית פרספקטיבה. iOS: CIPerspectiveCorrection עם העברה מפורשת של inputTopLeft, inputTopRight, inputBottomLeft, inputBottomRight בקואורדינטות תמונה (לא בתצוגה מקדימה). טעות נפוצה היא שימוש בקואורדינטות שכבת התצוגה המקדימה ישירות ללא חישוב מחדש דרך VNImagePointForNormalizedPoint. אנדרואיד: getPerspectiveTransform + warpPerspective מ-OpenCV או טרנספורמציית מטריצה דרך android.graphics.Matrix.setPolyToPoly. האחרון עובד ללא OpenCV אך מוגבל לטרנספורמציות אפיניות — לא מתאים לעיוות פרספקטיבה חזק. ב-Flutter — חישוב הומוגרפיה ידני באמצעות חבילת image או ערוץ מקורי.
יישום טכני של תיקון פרספקטיבה
עבור iOS: לאחר קבלת נקודות מ-VNRectangleObservation, יש להמיר אותן לקואורדינטות תמונה דרך VNImagePointForNormalizedPoint. לאחר מכן להעביר ל-CIPerspectiveCorrection. לניפוי באגים, ציירו את קו המתאר על AVCaptureVideoPreviewLayer דרך CAShapeLayer תוך עדכון כל 5 פריימים. באנדרואיד: השתמשו ב-getPerspectiveTransform מ-OpenCV, אך למסלולים שאינם OpenCV — setPolyToPoly עם PST (טרנספורמציית פרספקטיבה) דרך PST (perspective transform). חשוב: תחת עיוות חזק, טרנספורמציות אפיניות נותנות שגיאה של עד 15% בקצוות.
עיבוד לאחר: קריאות לפני יופי
לאחר יישור, יש לעבד את המסמך לקריאות בהדפסה או ב-OCR:
-
בינאריזציה אדפטיבית —
Matrixעם שיטת גאוס עובדת טוב יותר מ-Otsu על מסמכים עם תאורה לא אחידה. - Deskew — אם המסמך מסובב ב-1–2° לאחר הטרנספורמציה, Hough Lines מוצא את השיפוע של שורות הטקסט ומתקן אותו.
-
חדות —
cv::adaptiveThreshold(iOS) או מסנן Sharpness (אנדרואיד) עם ערך מתון (0.4–0.6), לא יותר.
יש לתת למשתמש מצבי צבע: "אוטומטי", "מסמך" (שחור ולבן), "תמונה" (צבע מלא). במצב "מסמך" — בינאריזציה. במצב "אוטומטי" — ניתוח היסטוגרמה: אם המסמך מכיל <5% פיקסלים רוויים, יש להחיל עיבוד מונוכרומי.
| שלב | iOS | אנדרואיד | Flutter |
|---|---|---|---|
| זיהוי | Vision (VNDetectRectanglesRequest) | ML Kit Document Scanner / OpenCV | cunning_document_scanner / ערוץ |
| טרנספורמציה | CIPerspectiveCorrection | OpenCV warpPerspective / Matrix.setPolyToPoly | ידני ב-Dart (חבילת image) |
| עיבוד לאחר | CIFilters (Sharpen, Binarization) | OpenCV adaptiveThreshold + deskew | ערוץ פלטפורמה / מסנני dart |
| ייצוא PDF | PDFKit (UIGraphicsPDFRenderer) | android.graphics.pdf.PdfDocument | חבילת pdf (pub.dev) |
סקירת ביצועים בפלטפורמות שונות
| פרמטר | iOS (iPhone 13) | אנדרואיד (Pixel 6) | Flutter (ערוץ מקורי) |
|---|---|---|---|
| זמן זיהוי | ~80 אלפיות השנייה | ~110 אלפיות השנייה | ~150 אלפיות השנייה (עם תקורה של גשר) |
| גודל PDF (A4) | ~200 KB | ~220 KB | ~230 KB |
| קצב פריימים בתצוגה מקדימה | 30 FPS | 30 FPS | 24 FPS |
סריקה מרובת עמודים ו-PDF
אנו אוספים CISharpenLuminance / Sharpness, מייצאים דרך UIImage[] (iOS 11+) או Bitmap[]. ב-Flutter — חבילת PDFKit (pub.dev). אנו מייעלים גודל PDF: דחיסת JPEG של 85% מספיקה לקריאות, עם עמוד A4 של ~150–250 KB לעומת 2–4 MB ל-PNG. תצוגה מקדימה בזמן אמת: אנו מציגים את קו המתאר על גבי android.graphics.pdf.PdfDocument / pdf דרך AVCaptureVideoPreviewLayer / PreviewView. אנו מעדכנים את קו המתאר כל 3–5 פריימים (לא כל פריים) — אחרת הגלאי צורך CPU והתצוגה המקדימה מתעכבת.
מה כלול בעבודת שילוב הסריקה
- ביקורת דרישות: ניתוח סוגי מסמכים, תנאי צילום, פלטפורמות יעד.
- בחירת SDK: Vision/ML Kit מקורי לעומת OpenCV לעומת פתרונות מוכנים.
- שילוב תצוגה מקדימה עם שכבת קו מתאר דינמית.
- יישום זיהוי, תיקון פרספקטיבה ועיבוד לאחר.
- ייצוא PDF עם דחיסה והגדרות מצב צבע.
- בדיקות על 10+ סוגי מסמכים: דרכון, חוזה, קבלה, ספר פתוח.
- תיעוד API ומסירת קוד מקור.
הניסיון שלנו: מעל 50 פרויקטי סריקה מוצלחים, מעל 5 שנים בפיתוח מובייל. אנו מבטיחים פעולה יציבה במכשירים מודרניים. הזמינו שילוב סריקת מסמכים באפליקציה שלכם — צרו קשר להערכת לוחות זמנים ועלות. לוחות זמנים: מ-3 עד 5 ימי עסקים לפלטפורמה, ועוד 2–3 ימים עם OCR.
מידע נוסף: טרנספורמציה הומוגרפית היא מרכיב מפתח בתיקון פרספקטיבה.







